diff --git a/config/Makefile.depend b/config/Makefile.depend
index d0bd15897e4fbca79970f505315aa532036938c8..a4b03250c3fd00f25cdc913ebc54a0fce59efe01 100644
--- a/config/Makefile.depend
+++ b/config/Makefile.depend
@@ -6,7 +6,7 @@ TCLINGLIBDEPM          = $(IOLIB)
 IOLIBDEPM              = $(THREADLIB)
 NETLIBDEPM             = $(IOLIB) $(MATHCORELIB)
 MATRIXLIBDEPM          = $(MATHCORELIB)
-HISTLIBDEPM            = $(MATRIXLIB) $(MATHCORELIB)
+HISTLIBDEPM            = $(IOLIB) $(MATRIXLIB) $(MATHCORELIB)
 GRAFLIBDEPM            = $(HISTLIB) $(MATRIXLIB) $(MATHCORELIB) $(IOLIB)
 GPADLIBDEPM            = $(GRAFLIB) $(HISTLIB) $(MATHCORELIB)
 G3DLIBDEPM             = $(GRAFLIB) $(HISTLIB) $(GPADLIB) $(MATHCORELIB)
@@ -260,7 +260,7 @@ TCLINGLIBEXTRA          = lib/libRIO.lib
 IOLIBEXTRA              = lib/libThread.lib
 NETLIBEXTRA             = lib/libRIO.lib lib/libMathCore.lib
 MATRIXLIBEXTRA          = lib/libMathCore.lib
-HISTLIBEXTRA            = lib/libMatrix.lib lib/libMathCore.lib
+HISTLIBEXTRA            = lib/libRIO lib/libMatrix.lib lib/libMathCore.lib
 GRAFLIBEXTRA            = lib/libHist.lib lib/libMatrix.lib lib/libRIO.lib \
                           lib/libMathCore.lib
 GPADLIBEXTRA            = lib/libGraf.lib lib/libHist.lib lib/libMathCore.lib
@@ -448,7 +448,7 @@ TCLINGLIBEXTRA          = -Llib -lRIO
 IOLIBEXTRA              = -Llib -lThread
 NETLIBEXTRA             = -Llib -lRIO -lMathCore
 MATRIXLIBEXTRA          = -Llib -lMathCore
-HISTLIBEXTRA            = -Llib -lMatrix -lMathCore
+HISTLIBEXTRA            = -Llib -lRIO -lMatrix -lMathCore
 GRAFLIBEXTRA            = -Llib -lHist -lMatrix -lRIO -lMathCore
 GPADLIBEXTRA            = -Llib -lGraf -lHist -lMathCore
 G3DLIBEXTRA             = -Llib -lGraf -lHist -lGpad -lMathCore
diff --git a/core/base/inc/TStorage.h b/core/base/inc/TStorage.h
index 310de0d4320da0a42c572b6881323f9bed3bf481..0ada93d88c6e8c184832779450aa354c150ea7e6 100644
--- a/core/base/inc/TStorage.h
+++ b/core/base/inc/TStorage.h
@@ -116,6 +116,15 @@ inline size_t TStorage::GetMaxBlockSize() { return fgMaxBlockSize; }
 inline void TStorage::SetMaxBlockSize(size_t size) { fgMaxBlockSize = size; }
 
 inline FreeHookFun_t TStorage::GetFreeHook() { return fgFreeHook; }
+
+namespace ROOT {
+namespace Internal {
+using FreeIfTMapFile_t = bool(void*);
+R__EXTERN FreeIfTMapFile_t *gFreeIfTMapFile;
+R__EXTERN void *gMmallocDesc;
+}
+}
+
 #endif
 
 #endif
diff --git a/core/base/src/TStorage.cxx b/core/base/src/TStorage.cxx
index 9b93c77d3b7e11fa3e8dfd517e0200b8fd188dda..dd630ff3b3adaffa097dbb40076f615ac93f1a97 100644
--- a/core/base/src/TStorage.cxx
+++ b/core/base/src/TStorage.cxx
@@ -84,6 +84,11 @@ static void   **gTraceArray = 0;
 static Int_t    gTraceCapacity = 10, gTraceIndex = 0,
                 gMemSize = -1, gMemIndex = -1;
 
+// Used in NewDelete.cxx; set by TMapFile.
+ROOT::Internal::FreeIfTMapFile_t *ROOT::Internal::gFreeIfTMapFile = nullptr;
+void *ROOT::Internal::gMmallocDesc = 0; //is used and set in TMapFile
+
+
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Register a memory allocation operation. If desired one can trap an
diff --git a/core/clib/CMakeLists.txt b/core/clib/CMakeLists.txt
index bd988de25877d663b3a62c9d5394eca4dff453c2..2d12d51072d90bb24afa82ac0956577fcce17ab0 100644
--- a/core/clib/CMakeLists.txt
+++ b/core/clib/CMakeLists.txt
@@ -5,6 +5,8 @@
 set(Clib_dict_headers ${CMAKE_CURRENT_SOURCE_DIR}/inc/strlcpy.h
                       ${CMAKE_CURRENT_SOURCE_DIR}/inc/snprintf.h PARENT_SCOPE)
 
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/res)
+
 ROOT_OBJECT_LIBRARY(Clib *.c)
 
 ROOT_INSTALL_HEADERS()
diff --git a/core/clib/Module.mk b/core/clib/Module.mk
index 9fd6ed2d2a7b3eb0f288de17c677973747a8ca09..4034d29aef15c997d8621c5e61ab3e390ff84770 100644
--- a/core/clib/Module.mk
+++ b/core/clib/Module.mk
@@ -11,6 +11,7 @@ MODDIRI      := $(MODDIR)/inc
 CLIBDIR      := $(MODDIR)
 CLIBDIRS     := $(CLIBDIR)/src
 CLIBDIRI     := $(CLIBDIR)/inc
+CLIBDIRR     := $(CLIBDIR)/res
 
 ##### libClib (part of libCore) #####
 CLIBL        := $(MODDIRI)/LinkDef.h
@@ -51,3 +52,5 @@ distclean-$(MODNAME): clean-$(MODNAME)
 distclean::     distclean-$(MODNAME)
 
 ##### extra rules ######
+$(CLIBO): CXXFLAGS += -I$(CLIBDIRR)
+$(CLIBO): CFLAGS += -I$(CLIBDIRR)
diff --git a/core/clib/inc/Demangle.h b/core/clib/res/Demangle.h
similarity index 100%
rename from core/clib/inc/Demangle.h
rename to core/clib/res/Demangle.h
diff --git a/core/clib/inc/mmalloc.h b/core/clib/res/mmalloc.h
similarity index 100%
rename from core/clib/inc/mmalloc.h
rename to core/clib/res/mmalloc.h
diff --git a/core/clib/inc/mmconfig.h b/core/clib/res/mmconfig.h
similarity index 100%
rename from core/clib/inc/mmconfig.h
rename to core/clib/res/mmconfig.h
diff --git a/core/clib/inc/mmprivate.h b/core/clib/res/mmprivate.h
similarity index 100%
rename from core/clib/inc/mmprivate.h
rename to core/clib/res/mmprivate.h
diff --git a/core/meta/src/TClass.cxx b/core/meta/src/TClass.cxx
index 4eb7a72a871230dcf2d40a1fd44bcfc1bd0ae60b..ac5cb9807f17156b8a12c749e602a02603e105c5 100644
--- a/core/meta/src/TClass.cxx
+++ b/core/meta/src/TClass.cxx
@@ -119,14 +119,14 @@ using namespace std;
 
 TVirtualMutex* gInterpreterMutex = 0;
 
-void *gMmallocDesc = 0; //is used and set in TMapFile
 namespace {
    class TMmallocDescTemp {
    private:
       void *fSave;
    public:
-      TMmallocDescTemp(void *value = 0) : fSave(gMmallocDesc) { gMmallocDesc = value; }
-      ~TMmallocDescTemp() { gMmallocDesc = fSave; }
+      TMmallocDescTemp(void *value = 0) :
+         fSave(ROOT::Internal::gMmallocDesc) { ROOT::Internal::gMmallocDesc = value; }
+      ~TMmallocDescTemp() { ROOT::Internal::gMmallocDesc = fSave; }
    };
 }
 
diff --git a/core/meta/src/TStreamerElement.cxx b/core/meta/src/TStreamerElement.cxx
index fce03339ab74516918e69d12d68a38b7cf4573fb..72d94a6de75f717c20f3d6e9ad4c06effabb6742 100644
--- a/core/meta/src/TStreamerElement.cxx
+++ b/core/meta/src/TStreamerElement.cxx
@@ -46,8 +46,6 @@ static TString &IncludeNameBuffer() {
    return includeName;
 }
 
-extern void *gMmallocDesc;
-
 ////////////////////////////////////////////////////////////////////////////////
 /// Helper function to initialize the 'index/counter' value of
 /// the Pointer streamerElements.  If directive is a StreamerInfo and it correspond to the
diff --git a/core/newdelete/CMakeLists.txt b/core/newdelete/CMakeLists.txt
index 04fb54e07032eb076a65472433a451a000b7fd42..90ce169a1a6c828fc0013487b5c911457c44d002 100644
--- a/core/newdelete/CMakeLists.txt
+++ b/core/newdelete/CMakeLists.txt
@@ -2,6 +2,8 @@
 # CMakeLists.txt file for building ROOT core/newdelete package
 ############################################################################
 
+include_directories(${CMAKE_SOURCE_DIR}/core/clib/res)
+
 ROOT_LINKER_LIBRARY(New *.cxx DEPENDENCIES Core)
 ROOT_INSTALL_HEADERS()
 
diff --git a/core/newdelete/Module.mk b/core/newdelete/Module.mk
index 46c0ac912186d9bc15889178008e012c9378e1a4..faf53b4a2f303e6eaac670e480ee826ce3594ed7 100644
--- a/core/newdelete/Module.mk
+++ b/core/newdelete/Module.mk
@@ -49,3 +49,6 @@ distclean-$(MODNAME): clean-$(MODNAME)
 		@rm -f $(NEWDEP) $(NEWLIB)
 
 distclean::     distclean-$(MODNAME)
+
+##### extra rules ######
+$(NEWO): CXXFLAGS += -I$(ROOT_SRCDIR)/core/clib/res
diff --git a/core/newdelete/src/NewDelete.cxx b/core/newdelete/src/NewDelete.cxx
index c34265604d8e73cd02d1a86d611da7bb75af1f63..5049540eac008a1c55700e913c59e5013359efb6 100644
--- a/core/newdelete/src/NewDelete.cxx
+++ b/core/newdelete/src/NewDelete.cxx
@@ -63,7 +63,7 @@
 #include "MemCheck.h"
 #include "TObjectTable.h"
 #include "TError.h"
-#include "TMapFile.h"
+#include "TStorage.h" // for ROOT::Internal::gFreeIfTMapFile
 #include "TSystem.h"
 #include "mmalloc.h"
 
@@ -76,7 +76,6 @@ public:
 };
 static TReAllocInit gReallocInit;
 
-
 //---- memory checking macros --------------------------------------------------
 
 #if !defined(R__NOSTATS)
@@ -207,8 +206,8 @@ void *operator new(size_t size) R__THROW_BAD
    }
 
    void *vp;
-   if (gMmallocDesc)
-      vp = ::mcalloc(gMmallocDesc, RealSize(size), sizeof(char));
+   if (ROOT::Internal::gMmallocDesc)
+      vp = ::mcalloc(ROOT::Internal::gMmallocDesc, RealSize(size), sizeof(char));
    else
       vp = ::calloc(RealSize(size), sizeof(char));
    if (vp == 0)
@@ -236,8 +235,8 @@ void *operator new(size_t size, void *vp) R__THROW_NULL
          return TMemHashTable::AddPointer(size);
 
       void *vp;
-      if (gMmallocDesc)
-         vp = ::mcalloc(gMmallocDesc, RealSize(size), sizeof(char));
+      if (ROOT::Internal::gMmallocDesc)
+         vp = ::mcalloc(ROOT::Internal::gMmallocDesc, RealSize(size), sizeof(char));
       else
          vp = ::calloc(RealSize(size), sizeof(char));
       if (vp == 0)
@@ -271,10 +270,8 @@ void operator delete(void *ptr) R__THROW_NULL
       RemoveStatMagic(ptr, where);
       MemClear(RealStart(ptr), 0, RealSize(storage_size(ptr)));
       TSystem::ResetErrno();
-      TMapFile *mf = TMapFile::WhichMapFile(RealStart(ptr));
-      if (mf) {
-         if (mf->IsWritable()) ::mfree(mf->GetMmallocDesc(), RealStart(ptr));
-      } else {
+      if (!ROOT::Internal::gFreeIfTMapFile
+          || !ROOT::Internal::gFreeIfTMapFile(RealStart(ptr))) {
          do {
             TSystem::ResetErrno();
             ::free(RealStart(ptr));
@@ -351,8 +348,8 @@ void *CustomReAlloc1(void *ovp, size_t size)
       return ovp;
    RemoveStatMagic(ovp, where);
    void *vp;
-   if (gMmallocDesc)
-      vp = ::mrealloc(gMmallocDesc, RealStart(ovp), RealSize(size));
+   if (ROOT::Internal::gMmallocDesc)
+      vp = ::mrealloc(ROOT::Internal::gMmallocDesc, RealStart(ovp), RealSize(size));
    else
       vp = ::realloc((char*)RealStart(ovp), RealSize(size));
    if (vp == 0)
@@ -391,8 +388,8 @@ void *CustomReAlloc2(void *ovp, size_t size, size_t oldsize)
       return ovp;
    RemoveStatMagic(ovp, where);
    void *vp;
-   if (gMmallocDesc)
-      vp = ::mrealloc(gMmallocDesc, RealStart(ovp), RealSize(size));
+   if (ROOT::Internal::gMmallocDesc)
+      vp = ::mrealloc(ROOT::Internal::gMmallocDesc, RealStart(ovp), RealSize(size));
    else
       vp = ::realloc((char*)RealStart(ovp), RealSize(size));
    if (vp == 0)
diff --git a/core/rint/src/TRint.cxx b/core/rint/src/TRint.cxx
index 7fea8f04e0591a742308fefc8af72f9fb39cb2d8..eef3cde35ee457aea9af74ea94418c795f21c2b3 100644
--- a/core/rint/src/TRint.cxx
+++ b/core/rint/src/TRint.cxx
@@ -37,6 +37,7 @@
 #include "TInterpreter.h"
 #include "TObjArray.h"
 #include "TObjString.h"
+#include "TStorage.h" // ROOT::Internal::gMmallocDesc
 #include "TTabCom.h"
 #include "TError.h"
 #include <stdlib.h>
@@ -48,8 +49,6 @@
 #include <signal.h>
 #endif
 
-R__EXTERN void *gMmallocDesc; //is used and set in TMapFile and TClass
-
 ////////////////////////////////////////////////////////////////////////////////
 
 static Int_t Key_Pressed(Int_t key)
@@ -96,7 +95,7 @@ Bool_t TInterruptHandler::Notify()
    }
 
    // make sure we use the sbrk heap (in case of mapped files)
-   gMmallocDesc = 0;
+   ROOT::Internal::gMmallocDesc = 0;
 
    if (TROOT::Initialized() && gROOT->IsLineProcessing()) {
       Break("TInterruptHandler::Notify", "keyboard interrupt");
diff --git a/core/unix/CMakeLists.txt b/core/unix/CMakeLists.txt
index dc4768b1b00405b0995f255b06261e50d9e45d42..294b106f2fb98631bf6141b9a3e122dfc3d1bf2e 100644
--- a/core/unix/CMakeLists.txt
+++ b/core/unix/CMakeLists.txt
@@ -6,7 +6,8 @@ ROOT_GLOB_SOURCES(sources ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cxx)
 
 set(Unix_dict_headers  ${CMAKE_CURRENT_SOURCE_DIR}/inc/TUnixSystem.h PARENT_SCOPE)
 
-include_directories(${CMAKE_SOURCE_DIR}/net/net/inc)
+include_directories(${CMAKE_SOURCE_DIR}/net/net/inc
+  ${CMAKE_SOURCE_DIR}/core/clib/res)
 ROOT_OBJECT_LIBRARY(Unix ${sources})
 
 ROOT_INSTALL_HEADERS()
diff --git a/core/unix/Module.mk b/core/unix/Module.mk
index 4ef929dba3c2445529210020b3c73aeaa00eea7f..34be1f09df13aafa9b3d283d0e2f242e68d922da 100644
--- a/core/unix/Module.mk
+++ b/core/unix/Module.mk
@@ -44,3 +44,6 @@ distclean-$(MODNAME): clean-$(MODNAME)
 		@rm -f $(UNIXDEP)
 
 distclean::     distclean-$(MODNAME)
+
+##### extra rules ######
+$(UNIXO): CXXFLAGS += -I$(ROOT_SRCDIR)/core/clib/res
diff --git a/io/io/CMakeLists.txt b/io/io/CMakeLists.txt
index f32ecbaf35d822dce596995421db16a9bf43bc29..b4eb805b74218142343af33bb1272131468b1355 100644
--- a/io/io/CMakeLists.txt
+++ b/io/io/CMakeLists.txt
@@ -4,6 +4,8 @@
 
 set(libname RIO)
 
+include_directories(${CMAKE_SOURCE_DIR}/core/clib/res)
+
 ROOT_GENERATE_DICTIONARY(G__IO *.h STAGE1 MODULE ${libname} LINKDEF LinkDef.h)
 
 if(root7)
diff --git a/io/io/Module.mk b/io/io/Module.mk
index 672e3b49dd9054004f47477d7195539cec93465a..5f4fce6ee8de6bea78947063cea9ea93d34fc00f 100644
--- a/io/io/Module.mk
+++ b/io/io/Module.mk
@@ -72,3 +72,4 @@ distclean-$(MODNAME): clean-$(MODNAME)
 distclean::     distclean-$(MODNAME)
 
 ##### extra rules ######
+$(IOO): CXXFLAGS += -I$(ROOT_SRCDIR)/core/clib/res
diff --git a/io/io/inc/TMapFile.h b/io/io/inc/TMapFile.h
index 48bd9afdeaccba21ea8ef02ea6b4a11cdc11cb96..5955675ede06e7507834777e71416d5c2feb122d 100644
--- a/io/io/inc/TMapFile.h
+++ b/io/io/inc/TMapFile.h
@@ -21,10 +21,6 @@
 #ifndef ROOT_TROOT
 #include "TROOT.h"
 #endif
-#if !defined(__MMPRIVATE_H) && !defined(__CINT__)
-#include "mmprivate.h"
-#endif
-
 
 class TBrowser;
 class TDirectory;
@@ -159,34 +155,4 @@ public:
    TMapRec      *GetNext(Long_t offset = 0) const { return (TMapRec *)((Long_t) fNext + offset); }
 };
 
-////////////////////////////////////////////////////////////////////////////////
-/// Return the current location in the memory region for this malloc heap which
-/// represents the end of memory in use. Returns 0 if map file was closed.
-
-inline void *TMapFile::GetBreakval() const
-{
-   if (!fMmallocDesc) return 0;
-   return (void *)((struct mdesc *)fMmallocDesc)->breakval;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-inline TMapFile *TMapFile::WhichMapFile(void *addr)
-{
-   if (!gROOT || !gROOT->GetListOfMappedFiles()) return 0;
-
-   TObjLink *lnk = ((TList *)gROOT->GetListOfMappedFiles())->LastLink();
-   while (lnk) {
-      TMapFile *mf = (TMapFile*)lnk->GetObject();
-      if (!mf) return 0;
-      if ((ULong_t)addr >= mf->fBaseAddr + mf->fOffset &&
-          (ULong_t)addr <  (ULong_t)mf->GetBreakval() + mf->fOffset)
-         return mf;
-      lnk = lnk->Prev();
-   }
-   return 0;
-}
-
-R__EXTERN void *gMmallocDesc;  //is initialized in TClass.cxx
-
 #endif
diff --git a/io/io/src/TMapFile.cxx b/io/io/src/TMapFile.cxx
index 588279281263f3d5394a064a0fe7e85272a5fdc5..8d7f44325c86e510e5957aa4dd708fc9a283f71b 100644
--- a/io/io/src/TMapFile.cxx
+++ b/io/io/src/TMapFile.cxx
@@ -91,11 +91,14 @@ robust Streamer mechanism I opted for 3).
 #include "TKeyMapFile.h"
 #include "TDirectoryFile.h"
 #include "TBrowser.h"
+#include "TStorage.h"
 #include "TString.h"
 #include "TSystem.h"
 #include "TClass.h"
 #include "TBufferFile.h"
 #include "TVirtualMutex.h"
+#include "mmprivate.h"
+
 #include <cmath>
 
 #if defined(R__UNIX) && !defined(R__MACOSX) && !defined(R__WINGCC)
@@ -122,8 +125,34 @@ union semun {
 Long_t TMapFile::fgMapAddress = 0;
 void  *TMapFile::fgMmallocDesc = 0;
 
-//void *gMmallocDesc = 0; //is initialized in TClass.cxx
+//void *ROOT::Internal::gMmallocDesc = 0; //is initialized in TStorage.cxx
+
+
+namespace {
+////////////////////////////////////////////////////////////////////////////////
+/// Delete memory and return true if memory belongs to a TMapFile.
+   static bool FreeIfTMapFile(void* ptr) {
+      if (TMapFile *mf = TMapFile::WhichMapFile(ptr)) {
+         if (mf->IsWritable())
+            ::mfree(mf->GetMmallocDesc(), ptr);
+         return true;
+      }
+      return false;
+   }
+}
+
 
+////////////////////////////////////////////////////////////////////////////////
+/// Set ROOT::Internal::gFreeIfTMapFile on library load.
+
+struct SetFreeIfTMapFile_t {
+   SetFreeIfTMapFile_t() {
+      ROOT::Internal::gFreeIfTMapFile = FreeIfTMapFile;
+   }
+   ~SetFreeIfTMapFile_t() {
+      ROOT::Internal::gFreeIfTMapFile = nullptr;
+   }
+} gSetFreeIfTMapFile;
 
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -392,7 +421,7 @@ TMapFile::TMapFile(const char *name, const char *title, Option_t *option,
       if (fWritable) {
          // create new TMapFile object in mapped heap to get correct vtbl ptr
          CreateSemaphore();
-         gMmallocDesc = fMmallocDesc;
+         ROOT::Internal::gMmallocDesc = fMmallocDesc;
          TMapFile *mf = new TMapFile(*mapfil);
          mf->fFd        = fFd;
          mf->fWritable  = kTRUE;
@@ -403,10 +432,10 @@ TMapFile::TMapFile(const char *name, const char *title, Option_t *option,
          mf->CreateSemaphore(fSemaphore);
 #endif
          mmalloc_setkey(fMmallocDesc, 0, mf);
-         gMmallocDesc = 0;
+         ROOT::Internal::gMmallocDesc = 0;
          mapfil = mf;
       } else {
-         gMmallocDesc = 0;    // make sure we are in sbrk heap
+         ROOT::Internal::gMmallocDesc = 0;    // make sure we are in sbrk heap
          fOffset      = ((struct mdesc *) fMmallocDesc)->offset;
          TMapFile *mf = new TMapFile(*mapfil, fOffset);
          delete [] mf->fOption;
@@ -444,12 +473,12 @@ TMapFile::TMapFile(const char *name, const char *title, Option_t *option,
 
       CreateSemaphore();
 
-      gMmallocDesc = fMmallocDesc;
+      ROOT::Internal::gMmallocDesc = fMmallocDesc;
 
       mapfil = new TMapFile(*this);
       mmalloc_setkey(fMmallocDesc, 0, mapfil);
 
-      gMmallocDesc = 0;
+      ROOT::Internal::gMmallocDesc = 0;
 
       // store shadow mapfile
       fVersion  = -1;   // make this the shadow map file
@@ -474,7 +503,7 @@ zombie:
    // error in file opening occured, make this object a zombie
    MakeZombie();
    newMapFile   = this;
-   gMmallocDesc = 0;
+   ROOT::Internal::gMmallocDesc = 0;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -567,7 +596,7 @@ void TMapFile::Add(const TObject *obj, const char *name)
    if (lock)
       AcquireSemaphore();
 
-   gMmallocDesc = fMmallocDesc;
+   ROOT::Internal::gMmallocDesc = fMmallocDesc;
 
    const char *n;
    if (name && *name)
@@ -588,7 +617,7 @@ void TMapFile::Add(const TObject *obj, const char *name)
       fLast        = mr;
    }
 
-   gMmallocDesc = 0;
+   ROOT::Internal::gMmallocDesc = 0;
 
    if (lock)
       ReleaseSemaphore();
@@ -603,7 +632,7 @@ void TMapFile::Update(TObject *obj)
 
    AcquireSemaphore();
 
-   gMmallocDesc = fMmallocDesc;
+   ROOT::Internal::gMmallocDesc = fMmallocDesc;
 
    Bool_t all = (obj == 0) ? kTRUE : kFALSE;
 
@@ -627,7 +656,7 @@ void TMapFile::Update(TObject *obj)
       mr = mr->fNext;
    }
 
-   gMmallocDesc = 0;
+   ROOT::Internal::gMmallocDesc = 0;
 
    ReleaseSemaphore();
 }
@@ -1088,6 +1117,15 @@ Int_t TMapFile::GetBestBuffer()
    return (Int_t)(mean + std::sqrt(rms2));
 }
 
+////////////////////////////////////////////////////////////////////////////////
+/// Return the current location in the memory region for this malloc heap which
+/// represents the end of memory in use. Returns 0 if map file was closed.
+
+void *TMapFile::GetBreakval() const
+{
+   if (!fMmallocDesc) return 0;
+   return (void *)((struct mdesc *)fMmallocDesc)->breakval;
+}
 
 ////////////////////////////////////////////////////////////////////////////////
 /// Create a memory mapped file.
@@ -1183,3 +1221,22 @@ void TMapFile::operator delete(void *ptr)
 
    TObject::operator delete(ptr);
 }
+
+////////////////////////////////////////////////////////////////////////////////
+
+TMapFile *TMapFile::WhichMapFile(void *addr)
+{
+   if (!gROOT || !gROOT->GetListOfMappedFiles()) return 0;
+
+   TObjLink *lnk = ((TList *)gROOT->GetListOfMappedFiles())->LastLink();
+   while (lnk) {
+      TMapFile *mf = (TMapFile*)lnk->GetObject();
+      if (!mf) return 0;
+      if ((ULong_t)addr >= mf->fBaseAddr + mf->fOffset &&
+          (ULong_t)addr <  (ULong_t)mf->GetBreakval() + mf->fOffset)
+         return mf;
+      lnk = lnk->Prev();
+   }
+   return 0;
+}
+
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
index 9a978a1dfca8d47cce80215568bc17de3ced2243..a8c3239a4fcb931eeab0ac3990170feb10104b41 100644
--- a/main/CMakeLists.txt
+++ b/main/CMakeLists.txt
@@ -5,6 +5,7 @@
 
 if(NOT WIN32)
   ROOT_EXECUTABLE(rootn.exe rmain.cxx LIBRARIES New Core MathCore Rint)
+  SET_TARGET_PROPERTIES(rootn.exe PROPERTIES LINK_FLAGS "-Wl,--no-as-needed")
   ROOT_EXECUTABLE(roots.exe roots.cxx LIBRARIES Core MathCore)
   ROOT_EXECUTABLE(ssh2rpd ssh2rpd.cxx ${CMAKE_SOURCE_DIR}/core/clib/src/strlcpy.c )
   ROOT_EXECUTABLE(xpdtest xpdtest.cxx LIBRARIES Proof Tree Hist RIO Net Thread Matrix MathCore)
diff --git a/net/auth/Module.mk b/net/auth/Module.mk
index 86dc0bb75c2e80d7bcd678e94b039084b9e329fd..ba016538be7e0d84b0b93e368ce582cd31574a89 100644
--- a/net/auth/Module.mk
+++ b/net/auth/Module.mk
@@ -160,3 +160,4 @@ $(AFSAUTHO):    CXXFLAGS += $(AFSINCDIR) $(AFSEXTRACFLAGS)
 ifeq ($(MACOSX_SSL_DEPRECATED),yes)
 $(call stripsrc,$(AUTHDIRS)/TAuthenticate.o): CXXFLAGS += -Wno-deprecated-declarations
 endif
+$(DAEMONUTILSO): CXXFLAGS += -I$(ROOT_SRCDIR)/net/rpdutils/res
diff --git a/net/rootd/CMakeLists.txt b/net/rootd/CMakeLists.txt
index ed2956feea87964f24377ad820894523f4d2bbf9..d579a6eabf733cc9f01da657553ce8aaf676c3f4 100644
--- a/net/rootd/CMakeLists.txt
+++ b/net/rootd/CMakeLists.txt
@@ -6,8 +6,8 @@
 ROOT_EXECUTABLE(rootd *.cxx ${CMAKE_SOURCE_DIR}/core/clib/src/strlcpy.c
                       LIBRARIES rpdutil rsa ${GLOBUS_LIBRARIES} ${OPENSSL_LIBRARIES} ${CRYPTLIBS})
 
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../rpdutils/res)
+
 if(builtin_openssl)
   ROOT_ADD_BUILTIN_DEPENDENCIES(rootd OPENSSL)
 endif()
-
-ROOT_INSTALL_HEADERS()
diff --git a/net/rootd/Module.mk b/net/rootd/Module.mk
index 20ac8b36c7e516db7d0e93e981807a89b4641d8a..3f25274a289ac325d093034982e67203951f3896 100644
--- a/net/rootd/Module.mk
+++ b/net/rootd/Module.mk
@@ -53,4 +53,4 @@ distclean-$(MODNAME): clean-$(MODNAME)
 distclean::     distclean-$(MODNAME)
 
 ##### extra rules ######
-$(ROOTDO):  CXXFLAGS += $(AUTHFLAGS)
+$(ROOTDO):  CXXFLAGS += $(AUTHFLAGS) -I$(ROOT_SRCDIR)/net/rpdutils/res
diff --git a/net/rootd/inc/rootdp.h b/net/rootd/src/rootdp.h
similarity index 100%
rename from net/rootd/inc/rootdp.h
rename to net/rootd/src/rootdp.h
diff --git a/net/rpdutils/CMakeLists.txt b/net/rpdutils/CMakeLists.txt
index 94032b558ab4ce9acff9b17470bedb6b73b63ab9..ee32dea5436bdf3d91f4887cbb549464dc0e97f1 100644
--- a/net/rpdutils/CMakeLists.txt
+++ b/net/rpdutils/CMakeLists.txt
@@ -6,6 +6,8 @@
 ROOT_GLOB_SOURCES(rpdutilsrcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}  ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cxx)
 list(REMOVE_ITEM rpdutilsrcs src/rpdpriv.cxx src/rpdconn.cxx)
 
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/res)
+
 if(globus)
   add_definitions(-DR__GLBS)
   include_directories(${GLOBUS_INCLUDE_DIRS})
@@ -38,6 +40,3 @@ ROOT_LINKER_LIBRARY(SrvAuth rpdutils.cxx ssh.cxx LIBRARIES rpdutil rsa ${CRYPTLI
 if(builtin_openssl)
   ROOT_ADD_BUILTIN_DEPENDENCIES(SrvAuth OPENSSL)
 endif()
-
-
-ROOT_INSTALL_HEADERS()
diff --git a/net/rpdutils/Module.mk b/net/rpdutils/Module.mk
index f491f379457f3246c81c077ec9d06798a0bef9ed..6ec3ee5f9ea94cc4aecb258f87e04728e679ab3a 100644
--- a/net/rpdutils/Module.mk
+++ b/net/rpdutils/Module.mk
@@ -10,24 +10,21 @@ MODDIRI      := $(MODDIR)/inc
 
 RPDUTILDIR   := $(MODDIR)
 RPDUTILDIRS  := $(RPDUTILDIR)/src
-RPDUTILDIRI  := $(RPDUTILDIR)/inc
+RPDUTILDIRR  := $(RPDUTILDIR)/res
 
 ##### $(RPDUTILO) #####
-RPDUTILH     := $(filter-out $(MODDIRI)/rpdpriv.h, $(filter-out $(MODDIRI)/rpdconn.h, $(wildcard $(MODDIRI)/*.h)))
 RPDUTILS     := $(filter-out $(MODDIRS)/rpdpriv.cxx, $(filter-out $(MODDIRS)/rpdconn.cxx, $(wildcard $(MODDIRS)/*.cxx)))
 RPDUTILO     := $(call stripsrc,$(RPDUTILS:.cxx=.o))
 
 RPDUTILDEP   := $(RPDUTILO:.o=.d)
 
 ##### $(RPDCONNO) #####
-RPDCONNH     := $(MODDIRI)/rpdconn.h
 RPDCONNS     := $(MODDIRS)/rpdconn.cxx
 RPDCONNO     := $(call stripsrc,$(RPDCONNS:.cxx=.o))
 
 RPDCONNDEP   := $(RPDCONNO:.o=.d)
 
 ##### $(RPDPRIVO) #####
-RPDPRIVH     := $(MODDIRI)/rpdpriv.h
 RPDPRIVS     := $(MODDIRS)/rpdpriv.cxx
 RPDPRIVO     := $(call stripsrc,$(RPDPRIVS:.cxx=.o))
 
@@ -76,6 +73,7 @@ GLBSLIBS      += $(SSLLIBDIR) $(SSLLIB)
 endif
 
 # Combined...
+RPDALLO       := $(RPDUTILO) $(RPDCONNO) $(RPDPRIVO) $(SRVAUTHO)
 AUTHFLAGS     := $(EXTRA_AUTHFLAGS) $(SHADOWFLAGS) $(AFSFLAGS) $(SRPFLAGS) \
                  $(KRB5FLAGS) $(GLBSFLAGS)
 AUTHLIBS      := $(SHADOWLIBS) $(AFSLIBS) \
@@ -87,9 +85,6 @@ AUTHLIBS      += -lz
 endif
 
 # used in the main Makefile
-ALLHDRS       += $(patsubst $(MODDIRI)/%.h,include/%.h,$(RPDUTILH))
-ALLHDRS       += $(patsubst $(MODDIRI)/%.h,include/%.h,$(RPDCONNH))
-ALLHDRS       += $(patsubst $(MODDIRI)/%.h,include/%.h,$(RPDPRIVH))
 ALLLIBS       += $(SRVAUTHLIB)
 
 # include all dependency files
@@ -98,9 +93,6 @@ INCLUDEFILES  += $(RPDUTILDEP) $(RPDCONNDEP) $(RPDPRIVDEP)
 ##### local rules #####
 .PHONY:         all-$(MODNAME) clean-$(MODNAME) distclean-$(MODNAME)
 
-include/%.h:    $(RPDUTILDIRI)/%.h
-		cp $< $@
-
 $(SRVAUTHLIB):  $(SRVAUTHO) $(RSAO) $(DAEMONUTILSO) $(STRLCPYO) $(ORDER_) $(MAINLIBS) $(SRVAUTHLIBDEP)
 		@$(MAKELIB) $(PLATFORM) $(LD) "$(LDFLAGS)" \
 		   "$(SOFLAGS)" libSrvAuth.$(SOEXT) $@ "$(SRVAUTHO) $(RSAO)" \
@@ -119,6 +111,7 @@ distclean-$(MODNAME): clean-$(MODNAME)
 distclean::     distclean-$(MODNAME)
 
 ##### extra rules ######
+$(RPDALLO):  CXXFLAGS += -I$(RPDUTILDIRR)
 $(RPDUTILO): CXXFLAGS += $(AUTHFLAGS)
 ifeq ($(MACOSX_SSL_DEPRECATED),yes)
 $(call stripsrc,$(RPDUTILDIRS)/rpdutils.o): CXXFLAGS += -Wno-deprecated-declarations
diff --git a/net/rpdutils/inc/rpdconn.h b/net/rpdutils/res/rpdconn.h
similarity index 100%
rename from net/rpdutils/inc/rpdconn.h
rename to net/rpdutils/res/rpdconn.h
diff --git a/net/rpdutils/inc/rpddefs.h b/net/rpdutils/res/rpddefs.h
similarity index 100%
rename from net/rpdutils/inc/rpddefs.h
rename to net/rpdutils/res/rpddefs.h
diff --git a/net/rpdutils/inc/rpderr.h b/net/rpdutils/res/rpderr.h
similarity index 100%
rename from net/rpdutils/inc/rpderr.h
rename to net/rpdutils/res/rpderr.h
diff --git a/net/rpdutils/inc/rpdp.h b/net/rpdutils/res/rpdp.h
similarity index 100%
rename from net/rpdutils/inc/rpdp.h
rename to net/rpdutils/res/rpdp.h
diff --git a/net/rpdutils/inc/rpdpriv.h b/net/rpdutils/res/rpdpriv.h
similarity index 100%
rename from net/rpdutils/inc/rpdpriv.h
rename to net/rpdutils/res/rpdpriv.h
diff --git a/net/srputils/Module.mk b/net/srputils/Module.mk
index 77847d917d316cb794dc113e97398fdab104a24e..64002b706f127fc186e0010c493db5bc9cb74e56 100644
--- a/net/srputils/Module.mk
+++ b/net/srputils/Module.mk
@@ -76,5 +76,5 @@ distclean-$(MODNAME): clean-$(MODNAME)
 distclean::     distclean-$(MODNAME)
 
 ##### extra rules ######
-$(SRPUTILSO): CXXFLAGS += $(SRPINCDIR:%=-I%)
+$(SRPUTILSO): CXXFLAGS += $(SRPINCDIR:%=-I%) -I$(ROOT_SRCDIR)/net/rpdutils/res
 $(RTCONFO): CFLAGS += $(SRPUTILINCDIR:%=-I%) $(SRPINCDIR:%=-I%)
diff --git a/proof/proofd/CMakeLists.txt b/proof/proofd/CMakeLists.txt
index ec7c159f33bb36c42b2306928d392e0172175cad..8e6b92b5e0a571ff5446f79888ba2b367f97f47f 100644
--- a/proof/proofd/CMakeLists.txt
+++ b/proof/proofd/CMakeLists.txt
@@ -5,6 +5,7 @@
 
 include_directories(${XROOTD_INCLUDE_DIRS})
 include_directories(AFTER ${CMAKE_CURRENT_SOURCE_DIR}/inc)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../rpdutils/res)
 add_definitions(${XROOTD_CFLAGS})
 #
 # This should not be needed any longer after fix 039136791216af4620b9041e89d60c3ac0bab2f7
diff --git a/proof/proofd/Module.mk b/proof/proofd/Module.mk
index 3352cb01a6f4f2717c72ca9e76cbaf93af582464..13251013c5759dccb51faddfb9c05a0b13b7f860 100644
--- a/proof/proofd/Module.mk
+++ b/proof/proofd/Module.mk
@@ -56,8 +56,6 @@ XPDINCEXTRA  += $(PROOFDDIRI:%=-I%)
 XPDLIBEXTRA  := $(XROOTDDIRL)/libXrdClient.lib
 
 # used in the main Makefile
-PROOFDEXEH   := $(MODDIRI)/proofdp.h
-ALLHDRS      += $(patsubst $(MODDIRI)/%.h,include/%.h,$(PROOFDEXEH))
 ALLLIBS      += $(XPDLIB)
 
 # include all dependency files
@@ -92,7 +90,6 @@ $(XPCONNO): CXXFLAGS += $(XPDINCEXTRA) $(EXTRA_XRDFLAGS)
 else
 
 ##### proofd #####
-PROOFDEXEH   := $(MODDIRI)/proofdp.h
 PROOFDEXES   := $(MODDIRS)/proofd.cxx
 PROOFDEXEO   := $(call stripsrc,$(PROOFDEXES:.cxx=.o))
 PROOFDDEP    := $(PROOFDEXEO:.o=.d)
@@ -205,7 +202,6 @@ endif
 endif
 
 # used in the main Makefile
-ALLHDRS      += $(patsubst $(MODDIRI)/%.h,include/%.h,$(PROOFDEXEH))
 ALLEXECS     += $(PROOFDEXE)
 ifeq ($(HASXRD),yes)
 ALLLIBS      += $(XPDLIB)
@@ -259,10 +255,10 @@ distclean-$(MODNAME): clean-$(MODNAME)
 distclean::     distclean-$(MODNAME)
 
 ##### extra rules ######
-$(PROOFDEXEO): CXXFLAGS += $(AUTHFLAGS)
+$(PROOFDEXEO): CXXFLAGS += $(AUTHFLAGS) -I$(ROOT_SRCDIR)/net/rpdutils/res
 
 $(XPDO): $(XROOTDMAKE) $(XRDHDRS)
-$(XPDO): CXXFLAGS += $(XPDINCEXTRA) $(EXTRA_XRDFLAGS)
+$(XPDO): CXXFLAGS += $(XPDINCEXTRA) $(EXTRA_XRDFLAGS) $(BONJOURCPPFLAGS) -I$(ROOT_SRCDIR)/net/rpdutils/res
 
 ifneq ($(ICC_GE_9),)
 # remove when xrootd has moved from strstream.h -> sstream.
diff --git a/proof/proofd/inc/proofdp.h b/proof/proofd/src/proofdp.h
similarity index 100%
rename from proof/proofd/inc/proofdp.h
rename to proof/proofd/src/proofdp.h