diff --git a/common/configuration.cpp b/common/configuration.cpp
index 7a930cc4c62ee5a71fb23ac88866a2874421311d..e0f21feb9b6a30a1066927c8b6ea521cc27fbc26 100644
--- a/common/configuration.cpp
+++ b/common/configuration.cpp
@@ -3,11 +3,36 @@
 //GmshFWI Library
 
 #include "configuration.h"
+#include <gmsh.h>
+
+namespace gmodel = gmsh::model;
+namespace factory = gmsh::model::geo;
 
 using namespace gmshfem;
 using namespace gmshfem::common;
 using namespace gmshfem::domain;
 
+void ConfigurationInterface::mesh() const
+{
+  msg::print << "Generate meshes" << msg::endl;
+  gmsh::option::setNumber("General.Terminal", 1);
+
+  gmodel::add(_name);
+  if (!_remesh)
+  {
+    gmsh::open(_name + ".msh");
+    return;
+  }
+
+  wave_mesh();
+  data_mesh();
+
+  factory::synchronize();
+  gmodel::mesh::generate();
+
+  gmsh::write(_name + ".msh");
+}
+
 bool ConfigurationInterface::recIsValid(unsigned int shot,unsigned int rec) const
 {
   if( !(shot<_ns) && !(rec<nr(shot)) )
diff --git a/common/configuration.h b/common/configuration.h
index 881b0d8807f32b02afa44d6dcd6850f24f42b511..8818d6b341c14aebcc1dee9fb91e28cac8b91a17 100644
--- a/common/configuration.h
+++ b/common/configuration.h
@@ -51,7 +51,7 @@ public:
     };
     virtual ~ConfigurationInterface() {delete _parametrization;};
 
-    virtual void mesh() const = 0;
+    virtual void mesh() const;
     virtual double area() const = 0;
     virtual double data_area() const {return gmshfem::post::integrate(1._d_sf,_data_omega,"Gauss0");};
     virtual double datapoint_area() const = 0;
diff --git a/specific/configuration/circular_acquisition.cpp b/specific/configuration/circular_acquisition.cpp
index beb2b8aac2268a94740df0c854c1e23f6df4cf47..727e6fb53806d8b49965777d1aefb70babaf4cb6 100644
--- a/specific/configuration/circular_acquisition.cpp
+++ b/specific/configuration/circular_acquisition.cpp
@@ -264,26 +264,7 @@ namespace circular_acquisition
         }
     }
 
-    void Configuration::mesh() const
-    {
-        msg::print << "Generate meshes" << msg::endl;
-        gmsh::option::setNumber("General.Terminal", 1);
-
-        gmodel::add(_name);
-        if(!_remesh)
-        {
-          gmsh::open(_name+".msh");
-          return;
-        }
 
-        wave_mesh();
-        data_mesh();
-
-        factory::synchronize();
-        gmodel::mesh::generate();
-
-        gmsh::write(_name+".msh");
-    }
     void Configuration::wave_mesh() const
     {
         int p0 = factory::addPoint(0., 0., 0., _h);
diff --git a/specific/configuration/layeredvolume_acquisition.cpp b/specific/configuration/layeredvolume_acquisition.cpp
index bbcf3c869e0609ed08ff1df328edd62b079a3428..0acdab1a3b0126e5ad304a49d4ee79107737d72f 100644
--- a/specific/configuration/layeredvolume_acquisition.cpp
+++ b/specific/configuration/layeredvolume_acquisition.cpp
@@ -477,26 +477,6 @@ namespace layeredvolume_acquisition
         }
     }
 
-    void Configuration::mesh() const
-    {
-        msg::print << "Generate meshes" << msg::endl;
-        gmsh::option::setNumber("General.Terminal", 1);
-
-        gmodel::add(_name);
-        if(!_remesh)
-        {
-          gmsh::open(_name+".msh");
-          return;
-        }
-
-        wave_mesh();
-        data_mesh();
-
-        factory::synchronize();
-        gmodel::mesh::generate();
-
-        gmsh::write(_name+".msh");
-    }
     void Configuration::wave_mesh() const
     {
         std::vector<int> pl1(_layercoord1.size());
diff --git a/specific/configuration/surface_acquisition.cpp b/specific/configuration/surface_acquisition.cpp
index 40cb28b756b98243e47e2fc88069a8fa7eb54661..0a81f151044eba1020d48131d49c5578c27c307e 100644
--- a/specific/configuration/surface_acquisition.cpp
+++ b/specific/configuration/surface_acquisition.cpp
@@ -265,24 +265,7 @@ namespace surface_acquisition
         }
     }
 
-    void Configuration::mesh() const
-    {
-        msg::print << "Generate meshes" << msg::endl;
-        gmsh::option::setNumber("General.Terminal", 1);
-        gmodel::add(_name);
-        if(!_remesh)
-        {
-          gmsh::open(_name+".msh");
-          return;
-        }
-        wave_mesh();
-        data_mesh();
-
-        factory::synchronize();
-        gmodel::mesh::generate();
-
-        gmsh::write(_name+".msh");
-    }
+    
     void Configuration::wave_mesh() const
     {
         double Le0 = (_L - _Ler)/2.;
diff --git a/specific/configuration/volume_acquisition.cpp b/specific/configuration/volume_acquisition.cpp
index e4b2a78adc9a99f3bfbaa93b63f1019b445babdd..2ed4e1e516130c8e7989e2d44ecbcd761883534a 100644
--- a/specific/configuration/volume_acquisition.cpp
+++ b/specific/configuration/volume_acquisition.cpp
@@ -341,26 +341,6 @@ namespace volume_acquisition
         }
     }
 
-    void Configuration::mesh() const
-    {
-        msg::print << "Generate meshes" << msg::endl;
-        gmsh::option::setNumber("General.Terminal", 1);
-
-        gmodel::add(_name);
-        if(!_remesh)
-        {
-          gmsh::open(_name+".msh");
-          return;
-        }
-
-        wave_mesh();
-        data_mesh();
-
-        factory::synchronize();
-        gmodel::mesh::generate();
-
-        gmsh::write(_name+".msh");
-    }
     void Configuration::wave_mesh() const
     {
         int pb1 = factory::addPoint(0., 0., 0., _h);