diff --git a/src/analysis/Analysis.cpp b/src/analysis/Analysis.cpp
index 1d16fafe9ef8505791bd2d3b0ba0173560765856..8ef44ac4220cfc50d53f67693e33ce22de412352 100644
--- a/src/analysis/Analysis.cpp
+++ b/src/analysis/Analysis.cpp
@@ -191,7 +191,7 @@ argument_names(getNumberOfArguments())
       // We need no restart file if we are just collecting data and analyzing all of it
       std::string filename = getName() + "_" + getLabel() + ".chkpnt"; 
       if( write_chq ) rfile.link(*this);
-      if( plumed.getRestart() ){
+      if( getRestart() ){
           if( single_run ) error("cannot restart histogram when using the USE_ALL_DATA option");
           if( !write_chq ) warning("restarting without writing a checkpoint file is somewhat strange");
           // Read in data from input file
@@ -241,7 +241,7 @@ void Analysis::parseOutputFile( const std::string& key, std::string& filename ){
   parse(key,filename);
   if(filename=="dont output") return;
 
-  if( !plumed.getRestart() ){
+  if( !getRestart() ){
       OFile ofile; ofile.link(*this);
       ofile.setBackupString("analysis");
       ofile.backupAllFiles(filename);
diff --git a/src/bias/MetaD.cpp b/src/bias/MetaD.cpp
index d24e4f9e8a923eed3abac4012eff7e28f0e095e3..a80bdfbbb935cc10b3a79e61ef31da4ba117bd3c 100644
--- a/src/bias/MetaD.cpp
+++ b/src/bias/MetaD.cpp
@@ -642,7 +642,7 @@ isFirstStep(true)
    ifilesnames.push_back(fname);
    if(ifile->FileExist(fname)){
     ifile->open(fname);
-    if(plumed.getRestart()){
+    if(getRestart()){
      log.printf("  Restarting from %s:",ifilesnames[i].c_str());                  
      readGaussians(ifiles[i]);                                                    
     }
diff --git a/src/core/Action.cpp b/src/core/Action.cpp
index 0181bca9ab70294a42eb6cfbd8c875357f865646..c618c1721a17f4ae79418f4592ec5adf44ba3b5b 100644
--- a/src/core/Action.cpp
+++ b/src/core/Action.cpp
@@ -49,12 +49,14 @@ keys(keys)
 void Action::registerKeywords( Keywords& keys ){
   plumed_assert( keys.size()==0 );
   keys.add( "hidden", "LABEL", "a label for the action so that its output can be referenced in the input to other actions.  Actions with scalar output are referenced using their label only.  Actions with vector output must have a separate label for every component.  Individual componets are then refered to using label.component" );
+  keys.add("optional","RESTART","allows per-action setting of restart (YES/NO/AUTO)");
 }
 
 Action::Action(const ActionOptions&ao):
   name(ao.line[0]),
   line(ao.line),
   active(false),
+  restart(ao.plumed.getRestart()),
   plumed(ao.plumed),
   log(plumed.getLog()),
   comm(plumed.comm),
@@ -72,6 +74,15 @@ Action::Action(const ActionOptions&ao):
   }
   if( plumed.getActionSet().selectWithLabel<Action*>(label) ) error("label " + label + " has been already used");
   log.printf("  with label %s\n",label.c_str());
+
+  if ( keywords.exists("RESTART") ){
+    std::string srestart="AUTO";
+    parse("RESTART",srestart);
+    if(srestart=="YES") restart=true;
+    else if(srestart=="NO")  restart=false;
+    else if(srestart=="AUTO") {}
+    else error("RESTART should be either YES, NO, or AUTO");
+  }
 }
 
 Action::~Action(){
diff --git a/src/core/Action.h b/src/core/Action.h
index 4c526561692a7b6f448a38d093a884c4feedbe0c..3364079265f986265a46a77791e8c0e7c9155a6e 100644
--- a/src/core/Action.h
+++ b/src/core/Action.h
@@ -84,6 +84,8 @@ private:
 /// Option that you might have enabled 
   std::set<std::string> options; 
 
+  bool restart;
+
 public:
 
 /// Reference to main plumed object
@@ -107,6 +109,9 @@ public:
 /// Return the timestep
   double getTimeStep()const;
 
+/// Return true if we are doing a restart
+  bool getRestart()const;
+
 /// Parse one keyword as generic type
   template<class T>
   void parse(const std::string&key,T&t);
@@ -381,6 +386,11 @@ bool Action::isOptionOn(const std::string &s)const{
   return options.count(s);
 }
 
+inline
+bool Action::getRestart()const{
+  return restart;
+}
+
 }
 #endif
 
diff --git a/src/core/ActionSetup.cpp b/src/core/ActionSetup.cpp
index deea21bd72871d9c4cf7471c4362ec425c961704..016da403da779258d13d95da1d93afcfbde4c1d6 100644
--- a/src/core/ActionSetup.cpp
+++ b/src/core/ActionSetup.cpp
@@ -39,6 +39,8 @@ ActionSetup::ActionSetup(const ActionOptions&ao):
 void ActionSetup::registerKeywords( Keywords& keys ){
   Action::registerKeywords(keys);
   keys.remove("LABEL");
+  keys.remove("RESTART");
+
 }
 
 }
diff --git a/src/setup/Restart.cpp b/src/setup/Restart.cpp
index 440a76e44a7ea5eaa3088fe768334a183b544257..9a9ee67565a313112bbaf54ebca0860f0cb49855 100644
--- a/src/setup/Restart.cpp
+++ b/src/setup/Restart.cpp
@@ -35,7 +35,18 @@ namespace setup{
 Activate restart.
 
 This is a Setup directive and, as such, should appear
-at the beginning of the input file.
+at the beginning of the input file. It influences the way
+PLUMED treat files open for writing (see also \ref Files).
+
+Notice that it is also possible to enable or disable restart on a per-action
+basis using the RESTART keyword on a single action. In this case,
+the keyword should be assigned a value. RESTART=AUTO means that global
+settings are used, RESTART=YES or RESTART=NO respectively enable
+and disable restart for that single action.
+
+\attention
+This directive can have also other side effects, e.g. on \ref METAD
+and on some analysis action.
 
 \par Examples
 
@@ -44,7 +55,9 @@ Using the following input:
 d: DISTANCE ATOMS=1,2
 PRINT ARG=d FILE=out
 \endverbatim
+(See also \ref DISTANCE and \ref PRINT).
 a new 'out' file will be created. If an old one is on the way, it will be automatically backed up.
+
 On the other hand, using the following input:
 \verbatim
 RESTART
@@ -54,8 +67,18 @@ PRINT ARG=d FILE=out
 the file 'out' will be appended.
 (See also \ref DISTANCE and \ref PRINT).
 
-\attention
-This directive can have also other side effects, e.g. on \ref METAD
+In the following case, file out1 will be backed up and file out2 will be concatenated
+\verbatim
+RESTART
+d1: DISTANCE ATOMS=1,2
+d2: DISTANCE ATOMS=1,2
+PRINT ARG=d1 FILE=out1 RESTART=NO
+PRINT ARG=d2 FILE=out2
+\endverbatim
+(See also \ref DISTANCE and \ref PRINT).
+
+
+
 
 */
 //+ENDPLUMEDOC
diff --git a/src/tools/OFile.cpp b/src/tools/OFile.cpp
index 25312b5d1325a4de95cb75829dd2f84c8fdd648c..3a421459294bfb9d5eca65761eabc3ff1933ef8a 100644
--- a/src/tools/OFile.cpp
+++ b/src/tools/OFile.cpp
@@ -234,7 +234,7 @@ void OFile::setBackupString( const std::string& str ){
 }
 
 void OFile::backupAllFiles( const std::string& str ){
-  plumed_assert( backstring!="bck" && plumed && !plumed->getRestart() );
+  plumed_assert( backstring!="bck" && !checkRestart());
   size_t found=str.find_last_of("/\\");
   std::string filename = appendSuffix(str,plumed->getSuffix());
   std::string directory=filename.substr(0,found+1);
@@ -362,7 +362,9 @@ FileBase& OFile::flush(){
 }
 
 bool OFile::checkRestart()const{
-  if(enforceRestart_ || (plumed && plumed->getRestart() ) ) return true;
+  if(enforceRestart_) return true;
+  else if(action) return action->getRestart();
+  else if(plumed) return plumed->getRestart();
   else return false;
 }