diff --git a/src/GenericFlush.cpp b/src/GenericFlush.cpp
index eb2244e8a8eaf35740ce1aed5e9fd7657b1554d4..e6477d129e525ea81b3f1bceef9ff1fb8ba16918 100644
--- a/src/GenericFlush.cpp
+++ b/src/GenericFlush.cpp
@@ -55,6 +55,7 @@ public:
   static void registerKeywords( Keywords& keys );
   void calculate(){};
   void apply(){
+    plumed.fflush();
     log.flush();
     const ActionSet & actionSet(plumed.getActionSet());
     for(ActionSet::const_iterator p=actionSet.begin();p!=actionSet.end();++p)
diff --git a/src/PlumedFile.cpp b/src/PlumedFile.cpp
index 9ed59ef4d161531bce40de10c0be3374c3b9bbd1..ed12e3552eb580d7795d8c6947f9db1f16d20be1 100644
--- a/src/PlumedFile.cpp
+++ b/src/PlumedFile.cpp
@@ -116,6 +116,7 @@ PlumedFileBase& PlumedFileBase::open(const std::string& path,const std::string&
     const std::string pathsuf=path+plumed->getSuffix();
     fp=std::fopen(const_cast<char*>(pathsuf.c_str()),const_cast<char*>(mode.c_str()));
   }
+  if(plumed) plumed->insertFile(*this);
   if(!fp) fp=std::fopen(const_cast<char*>(path.c_str()),const_cast<char*>(mode.c_str()));
   plumed_massert(fp,"file " + path + "cannot be found");
   return *this;
diff --git a/src/PlumedMain.cpp b/src/PlumedMain.cpp
index 2619090b831157069fd666dce41feb034a6e2ee6..eec2949cdb05f7309beb4805d616ec6f834c67cf 100644
--- a/src/PlumedMain.cpp
+++ b/src/PlumedMain.cpp
@@ -595,6 +595,22 @@ std::string PlumedMain::cite(const std::string&item){
   return citations.cite(item);
 }
 
+void PlumedMain::fflush(){
+  for(files_iterator p=files.begin();p!=files.end();++p){
+    (*p)->flush();
+  }
+}
+
+void PlumedMain::insertFile(PlumedFileBase&f){
+  files.insert(&f);
+}
+
+void PlumedMain::eraseFile(PlumedFileBase&f){
+  files.erase(&f);
+}
+
+
+
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/PlumedMain.h b/src/PlumedMain.h
index e26b26ce89806b34b758ac153c1f6dd20f998279..a795b85e3f56f08822ed6269c4f1d224431f0d3c 100644
--- a/src/PlumedMain.h
+++ b/src/PlumedMain.h
@@ -27,6 +27,7 @@
 #include <cstdio>
 #include <string>
 #include <vector>
+#include <set>
 
 
 // !!!!!!!!!!!!!!!!!!!!!!    DANGER   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
@@ -59,6 +60,7 @@ class PlumedCommunicator;
 class Stopwatch;
 class Citations;
 class ExchangePatterns;
+class PlumedFileBase;
 
 /**
 Main plumed object.
@@ -119,6 +121,10 @@ private:
 
 /// Class of possible exchange patterns, used for BIASEXCHANGE but also for future parallel tempering
   ExchangePatterns exchangepatterns;
+
+  std::set<PlumedFileBase*> files;
+  typedef std::set<PlumedFileBase*>::iterator files_iterator;
+
 public:
 /// Flag to switch off virial calculation (for debug)
   bool novirial;
@@ -219,6 +225,12 @@ public:
   FILE* fopen(const char *path, const char *mode);
 /// Closes a file opened with PlumedMain::fopen()
   int fclose(FILE*fp);
+/// Insert a file
+  void insertFile(PlumedFileBase&);
+/// Erase a file
+  void eraseFile(PlumedFileBase&);
+/// Flush all files
+  void fflush();
 };
 
 /////