diff --git a/src/Colvar.cpp b/src/Colvar.cpp
index a0e93ecd11af8f20035748ae0cd01e0b7d46cb93..33cf38032de9d2ea4d8215789e87185d2fe673c1 100644
--- a/src/Colvar.cpp
+++ b/src/Colvar.cpp
@@ -87,3 +87,13 @@ void Colvar::apply(){
      if( getPntrToComponent(0)->applyForce( forces ) ) modifyForceOnEnergy()+=forces[0];
   }
 }
+
+void Colvar::setBoxDerivativesNoPbc(Value* v){
+  Tensor virial;
+  unsigned nat=getNumberOfAtoms();
+  for(unsigned i=0;i<nat;i++) virial-=Tensor(getPosition(i),
+    Vector(v->getDerivative(3*i+0),
+           v->getDerivative(3*i+1),
+           v->getDerivative(3*i+2)));
+  setBoxDerivatives(v,virial);
+}
diff --git a/src/Colvar.h b/src/Colvar.h
index a2988eacf84ce18ccd8e68a2283eb9e5cf19c384..c31d20a7ee5e9c77997ee1b9b6dbca6ff5132683 100644
--- a/src/Colvar.h
+++ b/src/Colvar.h
@@ -58,6 +58,12 @@ protected:
   const Tensor & getBoxDerivatives()const;
   const double & getForce()const;
   void apply();
+/// Set box derivatives automatically.
+/// It should be called after the setAtomsDerivatives has been used for all
+/// single atoms.
+/// \warning It only works for collective variable NOT using PBCs!
+  void           setBoxDerivativesNoPbc();
+  void           setBoxDerivativesNoPbc(Value*);
 public:
   bool checkIsEnergy(){return isEnergy;};
   Colvar(const ActionOptions&);
@@ -97,6 +103,12 @@ void Colvar::setBoxDerivatives(const Tensor&d){
   setBoxDerivatives(getPntrToValue(),d);
 }
 
+inline
+void Colvar::setBoxDerivativesNoPbc(){
+  setBoxDerivativesNoPbc(getPntrToValue());
+}
+
+
 }
 
 #endif
diff --git a/src/ColvarDipole.cpp b/src/ColvarDipole.cpp
index 66fcd7ed79dd1f492618b6c71c803bc10a08f40f..0382269ac4b8f6311b87ac464eb77f7917380ca4 100644
--- a/src/ColvarDipole.cpp
+++ b/src/ColvarDipole.cpp
@@ -86,7 +86,6 @@ PLUMED_COLVAR_INIT(ao)
 void ColvarDipole::calculate()
 {
  double dipole=0.;
- Tensor virial;
  vector<Vector> deriv(getNumberOfAtoms());
  Vector dipje;
  vector<double> charges(getNumberOfAtoms());
@@ -111,13 +110,12 @@ void ColvarDipole::calculate()
  for(unsigned int i=0;i<ga_lista.size();i++) {
    double dfunc=charges[i]/dipole;
    deriv[i] = deriv[i] + (dfunc)*dipje;
-   virial=virial-Tensor(getPosition(i),deriv[i]);
  }
 
 // for(unsigned i=0;i<getPositions().size();++i) setAtomsDerivatives(i,deriv[i]);
  for(unsigned i=0;i<getNumberOfAtoms();++i) setAtomsDerivatives(i,deriv[i]);
  setValue           (dipole);
- setBoxDerivatives  (virial);
+ setBoxDerivativesNoPbc();
 }
 
 }
diff --git a/src/ColvarGyration.cpp b/src/ColvarGyration.cpp
index 5c54da4a1fd5ff5982bfe851f2f81e9b5e57d1f4..a2719a86b9b26e6c9b6ff998d3ae9c1db2806883 100644
--- a/src/ColvarGyration.cpp
+++ b/src/ColvarGyration.cpp
@@ -144,7 +144,6 @@ use_masses(true)
 void ColvarGyration::calculate(){
 
   std::vector<Vector> derivatives( getNumberOfAtoms() );
-  Tensor virial; virial.zero();
   double totmass = 0.; 
   double d=0., rgyr=0.;
   Vector pos0, com, diff;
@@ -212,7 +211,6 @@ void ColvarGyration::calculate(){
       for(unsigned i=0;i<getNumberOfAtoms();i++){
         derivatives[i] /= rgyr*totmass;
         setAtomsDerivatives(i,derivatives[i]);
-        virial=virial+(-1.0*Tensor(getPosition(i),derivatives[i]));
       }
       break;
     }
@@ -222,7 +220,6 @@ void ColvarGyration::calculate(){
       for(unsigned i=0;i<getNumberOfAtoms();i++) {
         derivatives[i] *= 4.;  
         setAtomsDerivatives(i,derivatives[i]);
-        virial=virial+(-1.0*Tensor(getPosition(i),derivatives[i]));
       }
       break;
     }
@@ -345,13 +342,12 @@ void ColvarGyration::calculate(){
             derivatives[i][j]=(prefactor[0]*transf[j][0]*tX[0]+prefactor[1]*transf[j][1]*tX[1]+prefactor[2]*transf[j][2]*tX[2]);
         }
         setAtomsDerivatives(i,derivatives[i]);
-        virial=virial+(-1.0*Tensor(getPosition(i),derivatives[i]));
       }
       break;
     }
   }
   setValue(rgyr);
-  setBoxDerivatives(virial);
+  setBoxDerivativesNoPbc();
 }
 
 }
diff --git a/src/ColvarPathMSDBase.cpp b/src/ColvarPathMSDBase.cpp
index 5853035e47c8f23fcf01f315e46574f976ca54fd..1ac102cfd8608c448594a2145e35d2b97fa0d63a 100644
--- a/src/ColvarPathMSDBase.cpp
+++ b/src/ColvarPathMSDBase.cpp
@@ -153,15 +153,13 @@ void ColvarPathMSDBase::calculate(){
        for(unsigned i=0;i< derivs_s.size();i++){ derivs_s[i]+=tmp*(*it).distder[i] ;} 
        if(j==0){for(unsigned i=0;i< derivs_z.size();i++){ derivs_z[i]+=(*it).distder[i]*expval/partition;}} 
     }
-    Tensor virial,virialz;
     for(unsigned i=0;i< derivs_s.size();i++){
           setAtomsDerivatives (val_s_path[j],i,derivs_s[i]); 
-          virial=virial+(-1.0*Tensor(getPosition(i),derivs_s[i]));
-          if(j==0){setAtomsDerivatives (val_z_path,i,derivs_z[i]);virialz=virialz+(-1.0*Tensor(getPosition(i),derivs_z[i]));} 
+          if(j==0){setAtomsDerivatives (val_z_path,i,derivs_z[i]);} 
     }
-    setBoxDerivatives(val_s_path[j],virial);
-    if(j==0)setBoxDerivatives(val_z_path,virialz);
   }
+  for(unsigned i=0;i<val_s_path.size();++i) setBoxDerivativesNoPbc(val_s_path[i]);
+  setBoxDerivativesNoPbc(val_z_path);
   //
   //  here set next round neighbors
   //
diff --git a/src/ColvarRMSD.cpp b/src/ColvarRMSD.cpp
index c1a87bb927a7051398129bf752996a319f2c1b0c..840bf0e2f7096c4d8ec108ad662acf25bda550bc 100644
--- a/src/ColvarRMSD.cpp
+++ b/src/ColvarRMSD.cpp
@@ -158,8 +158,7 @@ void ColvarRMSD::calculate(){
   setValue(r);
   for(unsigned i=0;i<derivs.size();i++) setAtomsDerivatives(i,derivs[i]);
   Tensor virial;
-  for(unsigned i=0;i<derivs.size();i++) virial=virial+(-1.0*Tensor(getPosition(i),derivs[i]));
-  setBoxDerivatives(virial);
+  setBoxDerivativesNoPbc();
 }
 
 }