diff --git a/io/io/inc/TFileMerger.h b/io/io/inc/TFileMerger.h
index 7d8a1ce28da35a32cf985b585f4853d2a78d77ca..93693041c8e853d1be168bfa9ec7617f9739c595 100644
--- a/io/io/inc/TFileMerger.h
+++ b/io/io/inc/TFileMerger.h
@@ -81,7 +81,8 @@ public:
       kAllIncremental = kIncremental | kAll, // Merge incrementally all type of objects.
 
       kOnlyListed     = BIT(4),        // Only the objects specified in fObjectNames list
-      kSkipListed     = BIT(5)         // Skip objects specified in fObjectNames list
+      kSkipListed     = BIT(5),        // Skip objects specified in fObjectNames list
+      kKeepCompression= BIT(6)         // Keep compression level unchanged for each input files
    };
    TFileMerger(Bool_t isLocal = kTRUE, Bool_t histoOneGo = kTRUE);
    virtual ~TFileMerger();
diff --git a/io/io/src/TFileMerger.cxx b/io/io/src/TFileMerger.cxx
index ee02b48f2a453adfd346dd76295e20243e7d5ded..2d2340f8cc5211d4781d7dfc96515d0200a81afc 100644
--- a/io/io/src/TFileMerger.cxx
+++ b/io/io/src/TFileMerger.cxx
@@ -353,6 +353,7 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
    //   kNonResetable : merge only the objects without a MergeAfterReset member function.
    //   kOnlyListed   : merge only objects listed in fObjectNames
    //   kSkipListed   : skip merging of objects listed in fObjectNames
+   //   kKeepCompression : Keep compression level of the buffer as it is in each the original input files.
    Bool_t status = kTRUE;
    Bool_t onlyListed = kFALSE;
    if (fPrintLevel > 0) {
@@ -380,7 +381,7 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t
 
    TFileMergeInfo info(target);
 
-   if ((fFastMethod && !fCompressionChange)) {
+   if (fFastMethod && ((type&kKeepCompression) || !fCompressionChange) ) {
       info.fOptions.Append(" fast");
    }