diff --git a/src/BiasMetaD.cpp b/src/BiasMetaD.cpp
index efbdbc52dc235c279c896acd03a325efb166ded1..8dabf5c6ce1660f5a7bc60e05808c9461a4f18c1 100644
--- a/src/BiasMetaD.cpp
+++ b/src/BiasMetaD.cpp
@@ -135,10 +135,10 @@ private:
   string mw_dir_;
   int mw_id_;
   int mw_rstride_;
-  vector<PlumedIFile> ifiles;
+  vector<PlumedIFile*> ifiles;
   vector<string> ifilesnames;
   
-  void   readGaussians(PlumedIFile&);
+  void   readGaussians(PlumedIFile*);
   void   writeGaussian(const Gaussian&,PlumedOFile&);
   void   addGaussian(const Gaussian&);
   double getHeight(const vector<double>&);
@@ -337,16 +337,16 @@ mw_n_(-1), mw_dir_("./"), mw_id_(0), mw_rstride_(1)
     stringstream out; out << i;
     string fname = mw_dir_+"/"+hillsfname+"."+out.str();
     ifilesnames.push_back(fname);
-    PlumedIFile ifile;
-    ifile.link(*this);
-    ifile.open(fname,"r");
+    PlumedIFile *ifile = new PlumedIFile();
+    ifile->link(*this);
+    ifile->open(fname,"r");
     ifiles.push_back(ifile);
    }
   }else{
     ifilesnames.push_back(hillsfname);
-    PlumedIFile ifile;
-    ifile.link(*this);
-    ifile.open(hillsfname,"r");
+    PlumedIFile *ifile = new PlumedIFile();
+    ifile->link(*this);
+    ifile->open(hillsfname,"r");
     ifiles.push_back(ifile);
   }
  
@@ -357,12 +357,12 @@ mw_n_(-1), mw_dir_("./"), mw_id_(0), mw_rstride_(1)
     readGaussians(ifiles[i]);
    }
    // close only the walker own hills file (need for writing)
-   ifiles[mw_id_].close();
+   ifiles[mw_id_]->close();
    hillsOfile_.link(*this);
    hillsOfile_.open(ifilesnames[mw_id_],"aw");
   }else{
    // close only the walker own hills file (need for writing)
-   ifiles[mw_id_].close();
+   ifiles[mw_id_]->close();
    hillsOfile_.link(*this);
    hillsOfile_.open(ifilesnames[mw_id_],"w");
   } 
@@ -376,7 +376,7 @@ mw_n_(-1), mw_dir_("./"), mw_id_(0), mw_rstride_(1)
 
 }
 
-void BiasMetaD::readGaussians(PlumedIFile&ifile)
+void BiasMetaD::readGaussians(PlumedIFile *ifile)
 {
  unsigned ncv=getNumberOfArguments();
  double dummy;
@@ -385,12 +385,12 @@ void BiasMetaD::readGaussians(PlumedIFile&ifile)
  vector<double> sigma(ncv);
  double height;
  int nhills=0;
- while(ifile.scanField("time",dummy)){
+ while(ifile->scanField("time",dummy)){
   for(unsigned i=0;i<ncv;++i)
-    ifile.scanField(getPntrToArgument(i)->getName(),center[i]);
+    ifile->scanField(getPntrToArgument(i)->getName(),center[i]);
   // scan for multivariate label: record the actual file position so to eventually rewind 
     std::string sss;
-    ifile.scanField("multivariate",sss);
+    ifile->scanField("multivariate",sss);
     if(sss=="true") multivariate=true;
     else if(sss=="false") multivariate=false;
     else plumed_merror("cannot parse multivariate = "+ sss);
@@ -400,7 +400,7 @@ void BiasMetaD::readGaussians(PlumedIFile&ifile)
         Matrix<double> lower(ncv,ncv);
 	for (unsigned i=0;i<ncv;i++){
               for (unsigned j=0;j<ncv-i;j++){
-                      ifile.scanField("sigma_"+getPntrToArgument(j+i)->getName()+"_"+getPntrToArgument(j)->getName(),lower(j+i,j));
+                      ifile->scanField("sigma_"+getPntrToArgument(j+i)->getName()+"_"+getPntrToArgument(j)->getName(),lower(j+i,j));
                       upper(j,j+i)=lower(j+i,j);
               }
          }
@@ -418,13 +418,13 @@ void BiasMetaD::readGaussians(PlumedIFile&ifile)
 		}
 	}
   }else{
-  	for(unsigned i=0;i<ncv;++i)ifile.scanField("sigma_"+getPntrToArgument(i)->getName(),sigma[i]);
+  	for(unsigned i=0;i<ncv;++i)ifile->scanField("sigma_"+getPntrToArgument(i)->getName(),sigma[i]);
   }
   
-  ifile.scanField("height",height);
-  ifile.scanField("biasf",dummy);
-  ifile.scanField("clock",dummy);
-  ifile.scanField();
+  ifile->scanField("height",height);
+  ifile->scanField("biasf",dummy);
+  ifile->scanField("clock",dummy);
+  ifile->scanField();
   nhills++;
   
   if(welltemp_){height*=(biasf_-1.0)/biasf_;}