diff --git a/regtest/basic/rt15/COLVAR.reference b/regtest/basic/rt15/COLVAR.reference
new file mode 100644
index 0000000000000000000000000000000000000000..a95e7f5e5444f31cd84eae0cd6fbc48673de1170
--- /dev/null
+++ b/regtest/basic/rt15/COLVAR.reference
@@ -0,0 +1,3 @@
+#! FIELDS time d2
+ 0.000000 1.000000
+ 0.050000 9.000000
diff --git a/regtest/basic/rt15/Distance2.cpp b/regtest/basic/rt15/Distance2.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3ff1f3562f8a1a7cb4def4e4a82a16fe4db67238
--- /dev/null
+++ b/regtest/basic/rt15/Distance2.cpp
@@ -0,0 +1,130 @@
+/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+   Copyright (c) 2013 The plumed team
+   (see the PEOPLE file at the root of the distribution for a list of names)
+
+   See http://www.plumed-code.org for more information.
+
+   This file is part of plumed, version 2.0.
+
+   plumed is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   plumed is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with plumed.  If not, see <http://www.gnu.org/licenses/>.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
+#include "colvar/Colvar.h"
+#include "core/ActionRegister.h"
+
+#include <string>
+#include <cmath>
+
+using namespace std;
+
+namespace PLMD{
+
+class Distance : public colvar::Colvar {
+  bool components;
+  bool pbc;
+
+public:
+  static void registerKeywords( Keywords& keys );
+  Distance(const ActionOptions&);
+// active methods:
+  virtual void calculate();
+};
+
+PLUMED_REGISTER_ACTION(Distance,"DISTANCE2")
+
+void Distance::registerKeywords( Keywords& keys ){
+  Colvar::registerKeywords( keys );
+  keys.add("atoms","ATOMS","the pair of atom that we are calculating the distance between");
+  keys.addFlag("COMPONENTS",false,"calculate the x, y and z components of the distance separately and store them as label.x, label.y and label.z");  
+}
+
+Distance::Distance(const ActionOptions&ao):
+PLUMED_COLVAR_INIT(ao),
+components(false),
+pbc(true)
+{
+  vector<AtomNumber> atoms;
+  parseAtomList("ATOMS",atoms);
+  if(atoms.size()!=2)
+    error("Number of specified atoms should be 2");
+  parseFlag("COMPONENTS",components);
+  bool nopbc=!pbc;
+  parseFlag("NOPBC",nopbc);
+  pbc=!nopbc;
+  checkRead();
+
+  log.printf("  between atoms %d %d\n",atoms[0].serial(),atoms[1].serial());
+  if(pbc) log.printf("  using periodic boundary conditions\n");
+  else    log.printf("  without periodic boundary conditions\n");
+
+
+  if(!components){
+
+    addValueWithDerivatives(); setNotPeriodic();
+
+  } else{
+    addComponentWithDerivatives("x"); componentIsNotPeriodic("x");
+    addComponentWithDerivatives("y"); componentIsNotPeriodic("y");
+    addComponentWithDerivatives("z"); componentIsNotPeriodic("z");
+  }
+
+  requestAtoms(atoms);
+}
+
+
+// calculator
+void Distance::calculate(){
+
+  Vector distance;
+  if(pbc){
+    distance=pbcDistance(getPosition(0),getPosition(1));
+  } else {
+    distance=delta(getPosition(0),getPosition(1));
+  }
+  const double value=distance.modulo();
+  const double invvalue=1.0/value;
+
+  if(!components){
+
+    setAtomsDerivatives(0,-invvalue*distance);
+    setAtomsDerivatives(1,invvalue*distance);
+    setBoxDerivatives  (-invvalue*Tensor(distance,distance));
+    setValue           (value);
+
+  }else{
+
+    Value* valuex=getPntrToComponent("x");
+    Value* valuey=getPntrToComponent("y");
+    Value* valuez=getPntrToComponent("z");
+
+    setAtomsDerivatives (valuex,0,Vector(-1,0,0));
+    setAtomsDerivatives (valuex,1,Vector(+1,0,0));
+    setBoxDerivatives   (valuex,Tensor(distance,Vector(-1,0,0)));
+    valuex->set(distance[0]);
+
+    setAtomsDerivatives (valuey,0,Vector(0,-1,0));
+    setAtomsDerivatives (valuey,1,Vector(0,+1,0));
+    setBoxDerivatives   (valuey,Tensor(distance,Vector(0,-1,0)));
+    valuey->set(distance[1]);
+
+    setAtomsDerivatives (valuez,0,Vector(0,0,-1));
+    setAtomsDerivatives (valuez,1,Vector(0,0,+1));
+    setBoxDerivatives   (valuez,Tensor(distance,Vector(0,0,-1)));
+    valuez->set(distance[2]);
+  };
+}
+
+}
+
+
+
diff --git a/regtest/basic/rt15/Makefile b/regtest/basic/rt15/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3703b27cea227aa053fb6d1d73f861e4384dbcee
--- /dev/null
+++ b/regtest/basic/rt15/Makefile
@@ -0,0 +1 @@
+include ../../scripts/test.make
diff --git a/regtest/basic/rt15/config b/regtest/basic/rt15/config
new file mode 100644
index 0000000000000000000000000000000000000000..4d3237ab4a4ecd86b2983241a7de3ffb5917dcea
--- /dev/null
+++ b/regtest/basic/rt15/config
@@ -0,0 +1,3 @@
+type=driver
+plumed_needs="dlopen"
+arg="--plumed plumed.dat --trajectory-stride 10 --timestep 0.005 --ixyz trajectory.xyz"
diff --git a/regtest/basic/rt15/der2 b/regtest/basic/rt15/der2
new file mode 100644
index 0000000000000000000000000000000000000000..c7900cb654c6710b7753144beb12fe8d48a6e0c1
--- /dev/null
+++ b/regtest/basic/rt15/der2
@@ -0,0 +1 @@
+fake file just to test backup
diff --git a/regtest/basic/rt15/plumed.dat b/regtest/basic/rt15/plumed.dat
new file mode 100644
index 0000000000000000000000000000000000000000..408583cf10a090356a463a1b15e88c5020398c36
--- /dev/null
+++ b/regtest/basic/rt15/plumed.dat
@@ -0,0 +1,8 @@
+# This is loading a collective variable on the fly:
+LOAD FILE=Distance2.cpp
+
+d2: DISTANCE2 ATOMS=1,2
+
+PRINT FILE=COLVAR ARG=d2
+
+ENDPLUMED
diff --git a/regtest/basic/rt15/trajectory.xyz b/regtest/basic/rt15/trajectory.xyz
new file mode 100644
index 0000000000000000000000000000000000000000..aa856131c7ed36fea3adba7f25a7eb8bec2164fb
--- /dev/null
+++ b/regtest/basic/rt15/trajectory.xyz
@@ -0,0 +1,20 @@
+8
+10 0 0 0 10 0 0 0 10
+X 0.5 0.5 0.5
+X 0.5 0.5 9.5
+X 0.5 9.5 0.5
+X 0.5 9.5 9.5
+X 9.5 0.5 0.5
+X 9.5 0.5 9.5
+X 9.5 9.5 0.5
+X 9.5 9.5 9.5
+8
+10 10 0 0 10 10 10 0 10
+X 0.5 0.5 0.5
+X 0.5 0.5 9.5
+X 0.5 9.5 0.5
+X 0.5 9.5 9.5
+X 9.5 0.5 0.5
+X 9.5 0.5 9.5
+X 9.5 9.5 0.5
+X 9.5 9.4 9.5