diff --git a/regtest/basic/rt-make-wrappers/COLVAR.reference b/regtest/basic/rt-make-wrappers/COLVAR.reference
new file mode 100644
index 0000000000000000000000000000000000000000..b4d38c02e0c0b44b2d34f4261138e39d8e878ce3
--- /dev/null
+++ b/regtest/basic/rt-make-wrappers/COLVAR.reference
@@ -0,0 +1,56 @@
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
+#! FIELDS time d
+ 0.000000 0.000000
diff --git a/regtest/basic/rt-make-wrappers/Makefile b/regtest/basic/rt-make-wrappers/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3703b27cea227aa053fb6d1d73f861e4384dbcee
--- /dev/null
+++ b/regtest/basic/rt-make-wrappers/Makefile
@@ -0,0 +1 @@
+include ../../scripts/test.make
diff --git a/regtest/basic/rt-make-wrappers/config b/regtest/basic/rt-make-wrappers/config
new file mode 100644
index 0000000000000000000000000000000000000000..df1f95bf3ee289aa8367431334c00cf144754ddf
--- /dev/null
+++ b/regtest/basic/rt-make-wrappers/config
@@ -0,0 +1 @@
+type=make
diff --git a/regtest/basic/rt-make-wrappers/main.cpp b/regtest/basic/rt-make-wrappers/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c825b3633bb47bf753e49e6e3b1aeae8490dd1b9
--- /dev/null
+++ b/regtest/basic/rt-make-wrappers/main.cpp
@@ -0,0 +1,336 @@
+#include "plumed/wrapper/Plumed.h"
+#include <fstream>
+#include <iostream>
+#include <vector>
+
+extern "C"{
+  void plumed_f_ginitialized(int*i);
+  void plumed_f_gcreate();
+  void plumed_f_gcmd(char* key,void* val);
+  void plumed_f_gfinalize();
+  void plumed_f_global(char*c);
+  void plumed_f_create(char*c);
+  void plumed_f_cmd(char*c,char* key,void* val);
+  void plumed_f_finalize(char*c);
+  void plumed_f_ginitialized_(int*i);
+  void plumed_f_gcreate_();
+  void plumed_f_gcmd_(char* key,void* val);
+  void plumed_f_gfinalize_();
+  void plumed_f_global_(char*c);
+  void plumed_f_create_(char*c);
+  void plumed_f_cmd_(char*c,char* key,void* val);
+  void plumed_f_finalize_(char*c);
+  void plumed_f_ginitialized__(int*i);
+  void plumed_f_gcreate__();
+  void plumed_f_gcmd__(char* key,void* val);
+  void plumed_f_gfinalize__();
+  void plumed_f_global__(char*c);
+  void plumed_f_create__(char*c);
+  void plumed_f_cmd__(char*c,char* key,void* val);
+  void plumed_f_finalize__(char*c);
+  void PLUMED_F_GINITIALIZED(int*);
+  void PLUMED_F_GCREATE();
+  void PLUMED_F_GCMD(char* key,void* val);
+  void PLUMED_F_GFINALIZE();
+  void PLUMED_F_GLOBAL(char*c);
+  void PLUMED_F_CREATE(char*c);
+  void PLUMED_F_CMD(char*c,char* key,void* val);
+  void PLUMED_F_FINALIZE(char*c);
+  void PLUMED_F_GINITIALIZED_(int*);
+  void PLUMED_F_GCREATE_();
+  void PLUMED_F_GCMD_(char* key,void* val);
+  void PLUMED_F_GFINALIZE_();
+  void PLUMED_F_GLOBAL_(char*c);
+  void PLUMED_F_CREATE_(char*c);
+  void PLUMED_F_CMD_(char*c,char* key,void* val);
+  void PLUMED_F_FINALIZE_(char*c);
+  void PLUMED_F_GINITIALIZED__(int*);
+  void PLUMED_F_GCREATE__();
+  void PLUMED_F_GCMD__(char* key,void* val);
+  void PLUMED_F_GFINALIZE__();
+  void PLUMED_F_GLOBAL__(char*c);
+  void PLUMED_F_CREATE__(char*c);
+  void PLUMED_F_CMD__(char*c,char* key,void* val);
+  void PLUMED_F_FINALIZE__(char*c);
+}
+
+template<typename T,typename S>
+void testme(T p,S cmd){
+  int natoms=10;
+  std::vector<double> positions(3*natoms,0.0);
+  std::vector<double> masses(natoms,1.0);
+  std::vector<double> forces(3*natoms,0.0);
+  std::vector<double> virial(9,0.0);
+
+
+  cmd(p,(char*)"setNatoms",&natoms);
+  cmd(p,(char*)"init",NULL);
+  cmd(p,(char*)"readInputLine",(char*)"d: DISTANCE ATOMS=1,2");
+  cmd(p,(char*)"readInputLine",(char*)"PRINT ARG=d FILE=COLVAR RESTART=YES");
+  int step=1;
+  cmd(p,(char*)"setStep",&step);
+  cmd(p,(char*)"setPositions",&positions[0]);
+  cmd(p,(char*)"setMasses",&masses[0]);
+  cmd(p,(char*)"setForces",&forces[0]);
+  cmd(p,(char*)"setVirial",&virial[0]);
+  cmd(p,(char*)"calc",NULL);
+}
+
+template<typename S>
+void testme(S cmd){
+  int natoms=10;
+  std::vector<double> positions(3*natoms,0.0);
+  std::vector<double> masses(natoms,1.0);
+  std::vector<double> forces(3*natoms,0.0);
+  std::vector<double> virial(9,0.0);
+
+
+  cmd((char*)"setNatoms",&natoms);
+  cmd((char*)"init",NULL);
+  cmd((char*)"readInputLine",(char*)"d: DISTANCE ATOMS=1,2");
+  cmd((char*)"readInputLine",(char*)"PRINT ARG=d FILE=COLVAR RESTART=YES");
+  int step=1;
+  cmd((char*)"setStep",&step);
+  cmd((char*)"setPositions",&positions[0]);
+  cmd((char*)"setMasses",&masses[0]);
+  cmd((char*)"setForces",&forces[0]);
+  cmd((char*)"setVirial",&virial[0]);
+  cmd((char*)"calc",NULL);
+}
+
+void testmecpp(PLMD::Plumed&p){
+  int natoms=10;
+  std::vector<double> positions(3*natoms,0.0);
+  std::vector<double> masses(natoms,1.0);
+  std::vector<double> forces(3*natoms,0.0);
+  std::vector<double> virial(9,0.0);
+
+
+  p.cmd((char*)"setNatoms",&natoms);
+  p.cmd((char*)"init",NULL);
+  p.cmd((char*)"readInputLine",(char*)"d: DISTANCE ATOMS=1,2");
+  p.cmd((char*)"readInputLine",(char*)"PRINT ARG=d FILE=COLVAR RESTART=YES");
+  int step=1;
+  p.cmd((char*)"setStep",&step);
+  p.cmd((char*)"setPositions",&positions[0]);
+  p.cmd((char*)"setMasses",&masses[0]);
+  p.cmd((char*)"setForces",&forces[0]);
+  p.cmd((char*)"setVirial",&virial[0]);
+  p.cmd((char*)"calc",NULL);
+}
+
+int main(){
+  std::ofstream of("finished");
+// C++ version
+  {
+    of<<"C++\n";
+    if(!PLMD::Plumed::installed()) return 0;
+ 
+    {
+      PLMD::Plumed p;
+      testmecpp(p);
+    }
+
+    if(PLMD::Plumed::ginitialized()) return 0;
+    PLMD::Plumed::gcreate();
+    if(!PLMD::Plumed::ginitialized()) return 0;
+    // this requires move semantics and only works with C++11
+    //PLMD::Plumed fromglobal(PLMD::Plumed::global());
+    // here's a workaround for plumed 2.3:
+    PLMD::Plumed fromglobal(plumed_global());
+    testmecpp(fromglobal);
+    PLMD::Plumed::gfinalize();
+    if(PLMD::Plumed::ginitialized()) return 0;
+
+    PLMD::Plumed::gcreate();
+    testme(PLMD::Plumed::gcmd);
+    PLMD::Plumed::gfinalize();
+  }
+  {
+    of<<"C++ conversions\n";
+
+    {
+      char f[32];
+      PLMD::Plumed p;
+      p.toFortran(f);
+      testme(f,plumed_f_cmd);
+    }
+
+    char ff[32];
+    plumed_f_create(ff);
+// convert from fortran
+    PLMD::Plumed fromf(ff); // notice: this won't be deleted by destructor
+    testmecpp(fromf);
+    plumed_f_finalize(ff);
+
+    plumed c=plumed_create();
+    PLMD::Plumed fromc(c); // notice: this won't be deleted by destructor
+    testmecpp(fromc);
+    plumed_finalize(c);
+    
+  }
+  {
+// C version
+    of<<"C\n";
+    if(!plumed_installed()) return 0;
+    plumed p=plumed_create();
+    testme(p,plumed_cmd);
+    plumed_finalize(p);
+
+    if(plumed_ginitialized()) return 0;
+    plumed_gcreate();
+    if(!plumed_ginitialized()) return 0;
+    testme(plumed_global(),plumed_cmd);
+    plumed_gfinalize();
+    if(plumed_ginitialized()) return 0;
+
+    plumed_gcreate();
+    testme(plumed_gcmd);
+    plumed_gfinalize();
+  }
+  {
+// C version with convertions from/to fortran
+    of<<"C conversions\n";
+    char f[32];
+    plumed p=plumed_create();
+    plumed_c2f(p,f);
+    testme(f,plumed_f_cmd);
+    plumed_finalize(plumed_f2c(f));
+  }
+  {
+// Fortran version
+    of<<"fortran\n";
+    char p[32];
+    plumed_f_create(p);
+    testme(p,plumed_f_cmd);
+    plumed_f_finalize(p);
+
+    char p2[32];
+    int ini;
+    plumed_f_ginitialized(&ini); if(ini) return 0;
+    plumed_f_gcreate();
+    plumed_f_ginitialized(&ini); if(!ini) return 0;
+    plumed_f_global(p2);
+    testme(p2,plumed_f_cmd);
+    plumed_f_gfinalize();
+    plumed_f_ginitialized(&ini); if(ini) return 0;
+
+    plumed_f_gcreate();
+    testme(plumed_f_gcmd);
+    plumed_f_gfinalize();
+  }
+  {
+// Fortran version _
+    of<<"fortran_\n";
+    char p[32];
+    plumed_f_create_(p);
+    testme(p,plumed_f_cmd_);
+    plumed_f_finalize_(p);
+
+    char p2[32];
+    int ini;
+    plumed_f_ginitialized_(&ini); if(ini) return 0;
+    plumed_f_gcreate_();
+    plumed_f_ginitialized_(&ini); if(!ini) return 0;
+    plumed_f_global_(p2);
+    testme(p2,plumed_f_cmd_);
+    plumed_f_gfinalize_();
+    plumed_f_ginitialized_(&ini); if(ini) return 0;
+
+    plumed_f_gcreate_();
+    testme(plumed_f_gcmd_);
+    plumed_f_gfinalize_();
+  }
+  {
+// Fortran version __
+    of<<"fortran__\n";
+    char p[32];
+    plumed_f_create__(p);
+    testme(p,plumed_f_cmd__);
+    plumed_f_finalize__(p);
+
+    char p2[32];
+    int ini;
+    plumed_f_ginitialized__(&ini); if(ini) return 0;
+    plumed_f_gcreate__();
+    plumed_f_ginitialized__(&ini); if(!ini) return 0;
+    plumed_f_global__(p2);
+    testme(p2,plumed_f_cmd__);
+    plumed_f_gfinalize__();
+    plumed_f_ginitialized__(&ini); if(ini) return 0;
+
+    plumed_f_gcreate__();
+    testme(plumed_f_gcmd__);
+    plumed_f_gfinalize__();
+  }
+  {
+// Fortran version
+    of<<"FORTRAN\n";
+    char p[32];
+    PLUMED_F_CREATE(p);
+    testme(p,PLUMED_F_CMD);
+    PLUMED_F_FINALIZE(p);
+
+    char p2[32];
+    int ini;
+    PLUMED_F_GINITIALIZED(&ini); if(ini) return 0;
+    PLUMED_F_GCREATE();
+    PLUMED_F_GINITIALIZED(&ini); if(!ini) return 0;
+    PLUMED_F_GLOBAL(p2);
+    testme(p2,PLUMED_F_CMD);
+    PLUMED_F_GFINALIZE();
+    PLUMED_F_GINITIALIZED(&ini); if(ini) return 0;
+
+    PLUMED_F_GCREATE();
+    testme(PLUMED_F_GCMD);
+    PLUMED_F_GFINALIZE();
+  }
+  {
+// Fortran version _
+    of<<"FORTRAN_\n";
+    char p[32];
+    PLUMED_F_CREATE_(p);
+    testme(p,PLUMED_F_CMD_);
+    PLUMED_F_FINALIZE_(p);
+
+    char p2[32];
+    int ini;
+    PLUMED_F_GINITIALIZED_(&ini); if(ini) return 0;
+    PLUMED_F_GCREATE_();
+    PLUMED_F_GINITIALIZED_(&ini); if(!ini) return 0;
+    PLUMED_F_GLOBAL_(p2);
+    testme(p2,PLUMED_F_CMD_);
+    PLUMED_F_GFINALIZE_();
+    PLUMED_F_GINITIALIZED_(&ini); if(ini) return 0;
+
+    PLUMED_F_GCREATE__();
+    testme(PLUMED_F_GCMD__);
+    PLUMED_F_GFINALIZE__();
+  }
+  {
+// Fortran version __
+    of<<"FORTRAN__\n";
+    char p[32];
+    PLUMED_F_CREATE__(p);
+    testme(p,PLUMED_F_CMD__);
+    PLUMED_F_FINALIZE__(p);
+
+    char p2[32];
+    int ini;
+    PLUMED_F_GINITIALIZED__(&ini); if(ini) return 0;
+    PLUMED_F_GCREATE__();
+    PLUMED_F_GINITIALIZED__(&ini); if(!ini) return 0;
+    PLUMED_F_GLOBAL__(p2);
+    testme(p2,PLUMED_F_CMD__);
+    PLUMED_F_GFINALIZE__();
+    PLUMED_F_GINITIALIZED_(&ini); if(ini) return 0;
+
+    PLUMED_F_GCREATE__();
+    testme(PLUMED_F_GCMD__);
+    PLUMED_F_GFINALIZE__();
+  }
+
+  of<<"finished\n";
+
+  return 0;
+}