diff --git a/Database/APR/RootStorageSvc/src/RootDatabase.cpp b/Database/APR/RootStorageSvc/src/RootDatabase.cpp
index 71b9907f844f7fa8428415c5c330fdf6064a47ce..1e7297e901d08c00e51e1fa557062cae63a2fa8b 100644
--- a/Database/APR/RootStorageSvc/src/RootDatabase.cpp
+++ b/Database/APR/RootStorageSvc/src/RootDatabase.cpp
@@ -43,7 +43,8 @@ using namespace std;
 /// Standard Constuctor
 RootDatabase::RootDatabase(IOODatabase* idb)
 : DbDatabaseImp(idb), m_file(0), 
-  m_defCompression(1), 
+  m_defCompression(1),
+  m_defCompressionAlg(1),
   m_defSplitLevel(99),
   m_defAutoSave(16*1024*1024),
   m_defBufferSize(16*1024),
@@ -107,20 +108,23 @@ DbStatus RootDatabase::open(const DbDomain& domH,const std::string& nam,DbAccess
   const char* fname = nam.c_str();
   Bool_t result = ( mode == pool::READ ) ? kFALSE : gSystem->AccessPathName(fname, kFileExists);
   DbOption opt1("DEFAULT_COMPRESSION","");
-  DbOption opt2("DEFAULT_SPLITLEVEL","");
-  DbOption opt3("DEFAULT_AUTOSAVE","");
-  DbOption opt4("DEFAULT_BUFFERSIZE","");
-  DbOption opt5("TREE_BRANCH_OFFSETTAB_LEN","");
+  DbOption opt2("DEFAULT_COMPRESSIONALG","");
+  DbOption opt3("DEFAULT_SPLITLEVEL","");
+  DbOption opt4("DEFAULT_AUTOSAVE","");
+  DbOption opt5("DEFAULT_BUFFERSIZE","");
+  DbOption opt6("TREE_BRANCH_OFFSETTAB_LEN","");
   domH.getOption(opt1);
   domH.getOption(opt2);
   domH.getOption(opt3);
   domH.getOption(opt4);
   domH.getOption(opt5);
+  domH.getOption(opt6);
   opt1._getValue(m_defCompression);
-  opt2._getValue(m_defSplitLevel);
-  opt3._getValue(m_defAutoSave);
-  opt4._getValue(m_defBufferSize);
-  opt5._getValue(m_branchOffsetTabLen);
+  opt2._getValue(m_defCompressionAlg);
+  opt3._getValue(m_defSplitLevel);
+  opt4._getValue(m_defAutoSave);
+  opt5._getValue(m_defBufferSize);
+  opt6._getValue(m_branchOffsetTabLen);
   //gDebug = 2;
   TDirectory::TContext dirCtxt(0);
 
@@ -149,11 +153,9 @@ DbStatus RootDatabase::open(const DbDomain& domH,const std::string& nam,DbAccess
   }
 
   if ( mode == pool::READ )   {
-
     if (m_fileMgr == 0) {
       m_file = TFile::Open(fname);
     } else {
-
       void *vf(0);
       int r =  m_fileMgr->open(Io::ROOT,"RootDatabase",fname,Io::READ,vf,"POOL",false);
       if (r < 0) {
@@ -164,13 +166,10 @@ DbStatus RootDatabase::open(const DbDomain& domH,const std::string& nam,DbAccess
 	m_file = (TFile*)vf;
       }
     }
-
-
   }
   else if ( mode&pool::UPDATE && result == kFALSE )    {
-
     if (m_fileMgr == 0) {
-      m_file = TFile::Open(fname, "UPDATE", fname, m_defCompression);
+      m_file = TFile::Open(fname, "UPDATE", fname);
     } else {
       void *vf(0);
       int r =  m_fileMgr->open(Io::ROOT,"RootDatabase",fname,Io::APPEND,vf,"POOL",true);
@@ -180,16 +179,16 @@ DbStatus RootDatabase::open(const DbDomain& domH,const std::string& nam,DbAccess
 	    << DbPrint::endmsg;
       } else {      
 	m_file = (TFile*)vf;
-	if (m_file != 0) {
-	  m_file->SetCompressionLevel(m_defCompression);
-	}
       }
     }
-
+    if (m_file != 0) {
+      m_file->SetCompressionLevel(m_defCompression);
+      m_file->SetCompressionAlgorithm(m_defCompressionAlg);
+    }
   }
   else if ( pool::RECREATE == (mode&pool::RECREATE) )   {
     if (m_fileMgr == 0) {
-      m_file = TFile::Open(fname, "RECREATE", fname, m_defCompression);
+      m_file = TFile::Open(fname, "RECREATE", fname);
     } else {
       void *vf(0);
       int r =  m_fileMgr->open(Io::ROOT,"RootDatabase",fname,Io::WRITE|Io::CREATE,vf,"POOL",true);
@@ -199,15 +198,16 @@ DbStatus RootDatabase::open(const DbDomain& domH,const std::string& nam,DbAccess
 	    << DbPrint::endmsg;
       } else {      
 	m_file = (TFile*)vf;
-	if (m_file != 0) {
-	  m_file->SetCompressionLevel(m_defCompression);
-	}
       }
     }
+    if (m_file != 0) {
+      m_file->SetCompressionLevel(m_defCompression);
+      m_file->SetCompressionAlgorithm(m_defCompressionAlg);
+    }
   }
   else if ( mode&pool::CREATE && result == kTRUE )   {
     if (m_fileMgr == 0) {
-      m_file = TFile::Open(fname, "RECREATE", fname, m_defCompression);
+      m_file = TFile::Open(fname, "RECREATE", fname);
     } else {
       void *vf(0);
       int r =  m_fileMgr->open(Io::ROOT,"RootDatabase",fname,Io::WRITE|Io::CREATE,vf,"POOL",true);
@@ -217,11 +217,12 @@ DbStatus RootDatabase::open(const DbDomain& domH,const std::string& nam,DbAccess
 	    << DbPrint::endmsg;
       } else {      
 	m_file = (TFile*)vf;
-	if (m_file != 0) {
-	  m_file->SetCompressionLevel(m_defCompression);
-	}
       }
     }
+    if (m_file != 0) {
+      m_file->SetCompressionLevel(m_defCompression);
+      m_file->SetCompressionAlgorithm(m_defCompressionAlg);
+    }
   }
   else if ( mode&pool::CREATE && result == kFALSE )   {
     log << DbPrintLvl::Error << "You cannot open a ROOT file in mode CREATE"
@@ -371,6 +372,8 @@ DbStatus RootDatabase::getOption(DbOption& opt)  const   {
         return Error;
       else if ( !strcasecmp(n, "COMPRESSION_LEVEL") )     // int
         return opt._setValue(int(m_file->GetCompressionLevel()));
+      else if ( !strcasecmp(n, "COMPRESSION_ALGORITHM") ) // int
+        return opt._setValue(int(m_file->GetCompressionAlgorithm()));
       else if ( !strcasecmp(n, "COMPRESSION_FACTOR") )    // float
         return opt._setValue(double(m_file->GetCompressionFactor()));
       else if ( !strcasecmp(n, "CONTAINER_SPLITLEVEL") )  {
@@ -407,6 +410,8 @@ DbStatus RootDatabase::getOption(DbOption& opt)  const   {
     case 'D':
       if ( !strcasecmp(n,"DEFAULT_COMPRESSION") )         // int
         return opt._setValue(int(m_defCompression));
+      else if ( !strcasecmp(n,"DEFAULT_COMPRESSIONALG") ) // int
+        return opt._setValue(int(m_defCompressionAlg));
       else if ( !strcasecmp(n, "DEFAULT_SPLITLEVEL") )    // int
         return opt._setValue(int(m_defSplitLevel));
       else if ( !strcasecmp(n, "DEFAULT_AUTOSAVE") )      // int
@@ -512,6 +517,12 @@ DbStatus RootDatabase::setOption(const DbOption& opt)  {
         m_file->SetCompressionLevel(val);
         return Success;
       }
+      else if ( !strcasecmp(n, "COMPRESSION_ALGORITHM") )  {
+        int val=1;
+        opt._getValue(val);
+        m_file->SetCompressionAlgorithm(val);
+        return Success;
+      }
       else if ( !strcasecmp(n, "CONTAINER_SPLITLEVEL") )  {
         if (!opt.option().size()) {
           DbPrint log("RootDatabase.setOption");
@@ -526,15 +537,17 @@ DbStatus RootDatabase::setOption(const DbOption& opt)  {
       }
       break;
     case 'D':
-      if (      !strcasecmp(n, "DEFAULT_COMPRESSION") )
+      if (      !strcasecmp(n, "DEFAULT_COMPRESSION") )   // int
         return opt._getValue(m_defCompression);
-      else if ( !strcasecmp(n, "DEFAULT_SPLITLEVEL") )
+      else if ( !strcasecmp(n, "DEFAULT_COMPRESSIONALG") )// int
+        return opt._getValue(m_defCompressionAlg);
+      else if ( !strcasecmp(n, "DEFAULT_SPLITLEVEL") )    // int
         return opt._getValue(m_defSplitLevel);
       else if ( !strcasecmp(n, "DEFAULT_AUTOSAVE") )      // int
         return opt._getValue(m_defAutoSave);   
       else if ( !strcasecmp(n, "DEFAULT_BUFFERSIZE") )    // int
         return opt._getValue(m_defBufferSize);
-      else if ( !strcasecmp(n, "DEFAULT_WRITEPOLICY") )     // int
+      else if ( !strcasecmp(n, "DEFAULT_WRITEPOLICY") )   // int
         return opt._getValue(m_defWritePolicy);
       break;
     case 'F':
@@ -748,6 +761,8 @@ void RootDatabase::registerBranchContainer(RootTreeContainer* cont)
 /// Start/Commit/Rollback Database Transaction
 DbStatus RootDatabase::transAct(DbTransaction&  refTr )
 {
+   // process flush to write file
+   if( refTr.state() == Transaction::TRANSACT_FLUSH ) m_file->Write();
    // process commits only
    if( refTr.state() != Transaction::TRANSACT_COMMIT )
       return Success;
diff --git a/Database/APR/RootStorageSvc/src/RootDatabase.h b/Database/APR/RootStorageSvc/src/RootDatabase.h
index b19eeb8f689c116278f52cc9f32359f34feea6f0..ff3f72bec955e49a4f57c6d6f4bef5e646d1c8e3 100644
--- a/Database/APR/RootStorageSvc/src/RootDatabase.h
+++ b/Database/APR/RootStorageSvc/src/RootDatabase.h
@@ -48,6 +48,8 @@ namespace pool  {
     long long int m_counters[3];
     /// Default compression level
     int           m_defCompression;
+    /// Default compressionalgorithm 
+    int           m_defCompressionAlg;
     /// Default split level
     int           m_defSplitLevel;
     /// Default Autosave parameter for trees
diff --git a/Database/APR/RootStorageSvc/src/RootDomain.cpp b/Database/APR/RootStorageSvc/src/RootDomain.cpp
index f56fabca7ec9e2e55042e1f04921d098c801db34..dddc89b1121ebcc0389b860bd1bc0557385fc03b 100755
--- a/Database/APR/RootStorageSvc/src/RootDomain.cpp
+++ b/Database/APR/RootStorageSvc/src/RootDomain.cpp
@@ -29,6 +29,7 @@ using namespace pool;
 RootDomain::RootDomain(IOODatabase* idb)
 : DbDomainImp(idb),
   m_defCompression(1),
+  m_defCompressionAlg(1),
   m_defSplitLevel(99),
   m_defAutoSave(16*1024*1024),
   m_defBufferSize(16*1024),
@@ -63,6 +64,9 @@ DbStatus RootDomain::setOption(const DbOption& opt)  {
       if ( !strcasecmp(n, "DEFAULT_COMPRESSION") )  {
         return opt._getValue(m_defCompression);
       }
+      else if ( !strcasecmp(n, "DEFAULT_COMPRESSIONALG") )  {
+        return opt._getValue(m_defCompressionAlg);
+      }
       else if ( !strcasecmp(n, "DEFAULT_SPLITLEVEL") )  {
         return opt._getValue(m_defSplitLevel);
       }
@@ -139,6 +143,9 @@ DbStatus RootDomain::getOption(DbOption& opt) const   {
       if ( !strcasecmp(n, "DEFAULT_COMPRESSION") )  {
         return opt._setValue(int(m_defCompression));
       }
+      else if ( !strcasecmp(n, "DEFAULT_COMPRESSIONALG") )  {
+        return opt._setValue(int(m_defCompressionAlg));
+      }
       else if ( !strcasecmp(n, "DEFAULT_SPLITLEVEL") )  {
         return opt._setValue(int(m_defSplitLevel));
       }
diff --git a/Database/APR/RootStorageSvc/src/RootDomain.h b/Database/APR/RootStorageSvc/src/RootDomain.h
index 994f399dd16029753b4c3cda861c5d5a6859cba5..98b94e8cb89599273f5029295c1c3e2392915bf8 100755
--- a/Database/APR/RootStorageSvc/src/RootDomain.h
+++ b/Database/APR/RootStorageSvc/src/RootDomain.h
@@ -36,6 +36,8 @@ namespace pool  {
   protected:
     /// Default compression level
     int m_defCompression;
+    /// Default compression algorithm
+    int m_defCompressionAlg;
     /// Default split level
     int m_defSplitLevel;
     /// Default Autosave parameter for trees
diff --git a/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp b/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp
index ef368b87962769c526554ade24971f49240762bd..e15a0a1df608ba3e75428d7b7f6c7db7a230b82c 100755
--- a/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp
+++ b/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp
@@ -773,32 +773,29 @@ DbStatus RootTreeContainer::open( const DbDatabase& dbH,
       return Success;
     }
     else if ( !hasBeenCreated && mode&pool::CREATE )    {
-      int count, defCompression=1, defSplitLevel=99, 
+      int count, defSplitLevel=99, 
 	 defAutoSave=16*1024*1024, defBufferSize=16*1024,
 	 branchOffsetTabLen=0, containerSplitLevel=defSplitLevel, auxSplitLevel=defSplitLevel;
       DbStatus res = Success;
       try   {
-        DbOption opt1("DEFAULT_COMPRESSION","");
-        DbOption opt2("DEFAULT_SPLITLEVEL","");
-        DbOption opt3("DEFAULT_AUTOSAVE","");
-        DbOption opt4("DEFAULT_BUFFERSIZE","");
-	DbOption opt5("TREE_BRANCH_OFFSETTAB_LEN","");
-        DbOption opt6("CONTAINER_SPLITLEVEL", m_name);
-        DbOption opt7("CONTAINER_SPLITLEVEL", SG::AUX_POSTFIX);
-	dbH.getOption(opt1);
+        DbOption opt1("DEFAULT_SPLITLEVEL","");
+        DbOption opt2("DEFAULT_AUTOSAVE","");
+        DbOption opt3("DEFAULT_BUFFERSIZE","");
+	DbOption opt4("TREE_BRANCH_OFFSETTAB_LEN","");
+        DbOption opt5("CONTAINER_SPLITLEVEL", m_name);
+        DbOption opt6("CONTAINER_SPLITLEVEL", SG::AUX_POSTFIX);
+        dbH.getOption(opt1);
         dbH.getOption(opt2);
         dbH.getOption(opt3);
         dbH.getOption(opt4);
 	dbH.getOption(opt5);
         dbH.getOption(opt6);
-        dbH.getOption(opt7);
-        opt1._getValue(defCompression);
-        opt2._getValue(defSplitLevel);
-        opt3._getValue(defAutoSave);
-        opt4._getValue(defBufferSize);
-	opt5._getValue(branchOffsetTabLen);
-        opt6._getValue(containerSplitLevel);
-        opt7._getValue(auxSplitLevel);
+        opt1._getValue(defSplitLevel);
+        opt2._getValue(defAutoSave);
+        opt3._getValue(defBufferSize);
+	opt4._getValue(branchOffsetTabLen);
+        opt5._getValue(containerSplitLevel);
+        opt6._getValue(auxSplitLevel);
         if (containerSplitLevel == defSplitLevel) {
 	   if ( (m_name.size() >= 5 && m_name.substr(m_name.size()-5, 4) == SG::AUX_POSTFIX)
 	           || info->clazz().Properties().HasProperty("IAuxStore") ) containerSplitLevel = auxSplitLevel;
@@ -1130,6 +1127,8 @@ DbStatus RootTreeContainer::getOption(DbOption& opt)  const  {
         case 'C':
           if ( !strcasecmp(n+7,"COMPRESSION_LEVEL") )
             return opt._setValue(int(b->GetCompressionLevel()));
+          if ( !strcasecmp(n+7,"COMPRESSION_ALGORITHM") )
+            return opt._setValue(int(b->GetCompressionAlgorithm()));
           break;
         case 'E':
           if ( !strcasecmp(n+7,"ENTRIES") )
@@ -1252,6 +1251,12 @@ DbStatus RootTreeContainer::setOption(const DbOption& opt)  {
             b->SetCompressionLevel(val);
             return Success;
           }
+          if ( !strcasecmp(n+7,"COMPRESSION_ALGORITHM") )  {
+            int val=1;
+            opt._getValue(val);
+            b->SetCompressionAlgorithm(val);
+            return Success;
+          }
           break;
         case 'P':
           if ( !strcasecmp(n+7,"PRINT") )  {