diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index 9c9684c23b59e5296b22b6552399a06ed530cade..5a8dac7953a51b8a307f4a226005d88c72286242 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -212,82 +212,6 @@ void Connectivity<2>::_computeCellFaceAndFaceNodeConnectivities()
   }
 }
 
-
-template<size_t Dimension>
-Connectivity<Dimension>::
-Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector,
-             const std::vector<CellType>& cell_type_vector,
-             const std::vector<int>& cell_number_vector,
-             const std::vector<int>& node_number_vector,
-             const std::vector<int>& cell_owner_vector,
-             const std::vector<int>& node_owner_vector)
-{
-  Assert(cell_by_node_vector.size() == cell_type_vector.size());
-  Assert(cell_number_vector.size() == cell_type_vector.size());
-
-  auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemTId(ItemType::cell)][itemTId(ItemType::node)];
-  cell_to_node_matrix = cell_by_node_vector;
-
-  {
-    CellValue<CellType> cell_type(*this);
-    parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j){
-        cell_type[j] = cell_type_vector[j];
-      });
-    m_cell_type = cell_type;
-  }
-
-  {
-    CellValue<int> cell_number(*this);
-    cell_number = convert_to_array(cell_number_vector);
-    m_cell_number = cell_number;
-  }
-
-  {
-    NodeValue<int> node_number(*this);
-    node_number = convert_to_array(node_number_vector);
-    m_node_number = node_number;
-  }
-
-  {
-    CellValue<int> cell_global_index(*this);
-#warning index must start accounting number of global indices of other procs
-#warning must take care of ghost cells
-    int first_index = 0;
-    parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j) {
-      cell_global_index[j] = first_index+j;
-      });
-    m_cell_global_index = cell_global_index;
-  }
-
-
-  {
-    CellValue<double> inv_cell_nb_nodes(*this);
-    parallel_for(this->numberOfCells(), PASTIS_LAMBDA(const CellId& j) {
-        const auto& cell_nodes = cell_to_node_matrix.rowConst(j);
-        inv_cell_nb_nodes[j] = 1./cell_nodes.length;
-      });
-    m_inv_cell_nb_nodes = inv_cell_nb_nodes;
-  }
-
-  {
-    CellValue<int> cell_owner(*this);
-    cell_owner = convert_to_array(cell_owner_vector);
-    m_cell_owner = cell_owner;
-  }
-
-  {
-    NodeValue<int> node_owner(*this);
-    node_owner = convert_to_array(node_owner_vector);
-    m_node_owner = node_owner;
-  }
-
-  if constexpr (Dimension>1) {
-    this->_computeCellFaceAndFaceNodeConnectivities();
-  }
-}
-
-
 template<size_t Dimension>
 Connectivity<Dimension>::
 Connectivity(const ConnectivityDescriptor& descriptor)
@@ -366,29 +290,3 @@ Connectivity(const ConnectivityDescriptor& descriptor);
 
 template Connectivity3D::
 Connectivity(const ConnectivityDescriptor& descriptor);
-
-
-
-template Connectivity1D::
-Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector,
-             const std::vector<CellType>& cell_type_vector,
-             const std::vector<int>& cell_number_vector,
-             const std::vector<int>& node_number_vector,
-             const std::vector<int>& cell_owner_vector,
-             const std::vector<int>& node_owner_vector);
-
-template Connectivity2D::
-Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector,
-             const std::vector<CellType>& cell_type_vector,
-             const std::vector<int>& cell_number_vector,
-             const std::vector<int>& node_number_vector,
-             const std::vector<int>& cell_owner_vector,
-             const std::vector<int>& node_owner_vector);
-
-template Connectivity3D::
-Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector,
-             const std::vector<CellType>& cell_type_vector,
-             const std::vector<int>& cell_number_vector,
-             const std::vector<int>& node_number_vector,
-             const std::vector<int>& cell_owner_vector,
-             const std::vector<int>& node_owner_vector);
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 71044616c22611e8a0d73d3edb406f528d15868d..8c1abac16fb6ba8d6e96cb965a9e9997c3a731c3 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -41,12 +41,12 @@ class ConnectivityDescriptor
  private:
 
  public:
-  std::vector<std::vector<unsigned int>>& cell_by_node_vector;
-  std::vector<CellType>& cell_type_vector;
-  std::vector<int>& cell_number_vector;
-  std::vector<int>& node_number_vector;
-  std::vector<int>& cell_owner_vector;
-  std::vector<int>& node_owner_vector;
+  std::vector<std::vector<unsigned int>> cell_by_node_vector;
+  std::vector<CellType> cell_type_vector;
+  std::vector<int> cell_number_vector;
+  std::vector<int> node_number_vector;
+  std::vector<int> cell_owner_vector;
+  std::vector<int> node_owner_vector;
 
   ConnectivityDescriptor& operator=(const ConnectivityDescriptor&) = delete;
   ConnectivityDescriptor& operator=(ConnectivityDescriptor&&) = delete;
@@ -711,13 +711,6 @@ class Connectivity final
 
   Connectivity(const ConnectivityDescriptor& descriptor);
 
-  Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector,
-               const std::vector<CellType>& cell_type_vector,
-               const std::vector<int>& cell_number_vector,
-               const std::vector<int>& node_number_vector,
-               const std::vector<int>& cell_owner_vector,
-               const std::vector<int>& node_owner_vector);
-
   ~Connectivity()
   {
     ;
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 40bb1da8dd40ea1d60a0e9ae575e346d8612c0a8..b218aa71a1dfe55e5151bf6c6a52884826c1c509 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -295,9 +295,10 @@ void GmshReader::_dispatch()
   using MeshType = Mesh<ConnectivityType>;
 
   if (not m_mesh) {
-    std::shared_ptr<ConnectivityType> connectivity(new ConnectivityType({},{},{},{}, {}, {}));
+    ConnectivityDescriptor descriptor;
+    std::shared_ptr connectivity = std::make_shared<ConnectivityType>(descriptor);
     NodeValue<Rd> xr;
-    m_mesh = std::shared_ptr<IMesh>(new MeshType(connectivity, xr));
+    m_mesh = std::make_shared<MeshType>(connectivity, xr);
   }
   const MeshType& mesh = static_cast<const MeshType&>(*m_mesh);
 
@@ -362,12 +363,14 @@ void GmshReader::_dispatch()
           return node_number_id_map;
         } ();
 
-  std::vector<int> new_node_number(node_number_id_map.size());
+
+  ConnectivityDescriptor new_descriptor;
+
+  new_descriptor.node_number_vector.resize(node_number_id_map.size());
   for (const auto& [number, id] : node_number_id_map) {
-    new_node_number[id] = number;
+    new_descriptor.node_number_vector[id] = number;
   }
 
-  std::vector<std::vector<unsigned int>> cell_by_node_vector;
   for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
     int l=0;
     for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) {
@@ -377,7 +380,7 @@ void GmshReader::_dispatch()
         Assert(searched_node_id != node_number_id_map.end());
         node_vector.push_back(searched_node_id->second);
       }
-      cell_by_node_vector.emplace_back(node_vector);
+      new_descriptor.cell_by_node_vector.emplace_back(node_vector);
     }
   }
 
@@ -395,18 +398,18 @@ void GmshReader::_dispatch()
           return cell_number_id_map;
         } ();
 
-  std::vector<int> new_cell_number(cell_number_id_map.size());
+  new_descriptor.cell_number_vector.resize(cell_number_id_map.size());
   for (const auto& [number, id] : cell_number_id_map) {
-    new_cell_number[id] = number;
+    new_descriptor.cell_number_vector[id] = number;
   }
 
-  std::vector<CellType> new_cell_type(cell_number_id_map.size());
+  new_descriptor.cell_type_vector.resize(cell_number_id_map.size());
   for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
     for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) {
       int cell_number = recv_cell_number_by_proc[i_rank][i];
       const auto& searched_cell_id = cell_number_id_map.find(cell_number);
       Assert(searched_cell_id != cell_number_id_map.end());
-      new_cell_type[searched_cell_id->second] = recv_cell_type_by_proc[i_rank][i];
+      new_descriptor.cell_type_vector[searched_cell_id->second] = recv_cell_type_by_proc[i_rank][i];
     }
   }
 
@@ -466,13 +469,13 @@ void GmshReader::_dispatch()
 
   using ConnectivityType = Connectivity<Dimension>;
 
-  std::vector<int> cell_new_owner_vector(cell_number_id_map.size());
+  new_descriptor.cell_owner_vector.resize(cell_number_id_map.size());
   for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
     for (size_t i=0; i<recv_cell_number_by_proc[i_rank].size(); ++i) {
       int cell_number = recv_cell_number_by_proc[i_rank][i];
       const auto& searched_cell_id = cell_number_id_map.find(cell_number);
       Assert(searched_cell_id != cell_number_id_map.end());
-      cell_new_owner_vector[searched_cell_id->second] = recv_cell_new_owner_by_proc[i_rank][i];
+      new_descriptor.cell_owner_vector[searched_cell_id->second] = recv_cell_new_owner_by_proc[i_rank][i];
     }
   }
 
@@ -495,21 +498,16 @@ void GmshReader::_dispatch()
   }
   parallel::exchange(send_node_owner_by_proc, recv_node_owner_by_proc);
 
-  std::vector<int> node_new_owner_vector(new_node_number.size());
+  new_descriptor.node_owner_vector.resize(new_descriptor.node_number_vector.size());
   for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
     for (size_t r=0; r<recv_node_owner_by_proc[i_rank].size(); ++r) {
       const NodeId& node_id = recv_node_id_correspondance_by_proc[i_rank][r];
-      node_new_owner_vector[node_id] = recv_node_owner_by_proc[i_rank][r];
+      new_descriptor.node_owner_vector[node_id] = recv_node_owner_by_proc[i_rank][r];
     }
   }
 
-  std::shared_ptr<ConnectivityType> p_connectivity
-      = std::make_shared<ConnectivityType>(cell_by_node_vector,
-                                           new_cell_type,
-                                           new_cell_number,
-                                           new_node_number,
-                                           cell_new_owner_vector,
-                                           node_new_owner_vector);
+  std::shared_ptr p_connectivity
+      = std::make_shared<ConnectivityType>(new_descriptor);
 
   const NodeValue<const Rd>& xr = mesh.xr();
   std::vector<Array<const Rd>> send_node_coord_by_proc(parallel::size());
@@ -537,7 +535,7 @@ void GmshReader::_dispatch()
     }
   }
 
-  m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, new_xr));
+  m_mesh = std::make_shared<MeshType>(p_connectivity, new_xr);
 }
 
 
@@ -1228,8 +1226,6 @@ GmshReader::__proceedData()
     }
   }
 
-  const std::vector<int>& node_number_vector = __verticesNumbers;
-
   TinyVector<15,int> dimension0_mask = zero;
   dimension0_mask[14]=1;
   TinyVector<15,int> dimension1_mask = zero;
@@ -1257,42 +1253,44 @@ GmshReader::__proceedData()
   if ((dimension3_mask, elementNumber)>0) {
     const size_t nb_cells = (dimension3_mask, elementNumber);
 
-    std::vector<CellType> cell_type_vector(nb_cells);
-    std::vector<int> cell_number_vector(nb_cells);
+    ConnectivityDescriptor descriptor;
+
+    descriptor.node_number_vector = __verticesNumbers;
+    descriptor.cell_type_vector.resize(nb_cells);
+    descriptor.cell_number_vector.resize(nb_cells);
+    descriptor.cell_by_node_vector.resize(nb_cells);
 
-    std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells);
     const size_t nb_tetrahedra = __tetrahedra.size();
     for (size_t j=0; j<nb_tetrahedra; ++j) {
-      cell_by_node_vector[j].resize(4);
+      descriptor.cell_by_node_vector[j].resize(4);
       for (int r=0; r<4; ++r) {
-        cell_by_node_vector[j][r] = __tetrahedra[j][r];
+        descriptor.cell_by_node_vector[j][r] = __tetrahedra[j][r];
       }
-      cell_type_vector[j] = CellType::Tetrahedron;
-      cell_number_vector[j] = __tetrahedra_number[j];
+      descriptor.cell_type_vector[j] = CellType::Tetrahedron;
+      descriptor.cell_number_vector[j] = __tetrahedra_number[j];
     }
     const size_t nb_hexahedra = __hexahedra.size();
     for (size_t j=0; j<nb_hexahedra; ++j) {
       const size_t jh = nb_tetrahedra+j;
-      cell_by_node_vector[jh].resize(8);
+      descriptor.cell_by_node_vector[jh].resize(8);
       for (int r=0; r<8; ++r) {
-        cell_by_node_vector[jh][r] = __hexahedra[j][r];
+        descriptor.cell_by_node_vector[jh][r] = __hexahedra[j][r];
       }
-      cell_type_vector[jh] = CellType::Hexahedron;
-      cell_number_vector[jh] = __hexahedra_number[j];
+      descriptor.cell_type_vector[jh] = CellType::Hexahedron;
+      descriptor.cell_number_vector[jh] = __hexahedra_number[j];
     }
 
-    std::vector<int> cell_owner_vector(nb_cells);
-    std::fill(cell_owner_vector.begin(), cell_owner_vector.end(), parallel::rank());
-    std::vector<int> node_owner_vector(node_number_vector.size());
-    std::fill(node_owner_vector.begin(), node_owner_vector.end(), parallel::rank());
+    descriptor.cell_owner_vector.resize(nb_cells);
+    std::fill(descriptor.cell_owner_vector.begin(),
+              descriptor.cell_owner_vector.end(),
+              parallel::rank());
 
+    descriptor.node_owner_vector.resize(descriptor.node_number_vector.size());
+    std::fill(descriptor.node_owner_vector.begin(),
+              descriptor.node_owner_vector.end(),
+              parallel::rank());
 
-    std::shared_ptr<Connectivity3D> p_connectivity(new Connectivity3D(cell_by_node_vector,
-                                                                      cell_type_vector,
-                                                                      cell_number_vector,
-                                                                      node_number_vector,
-                                                                      cell_owner_vector,
-                                                                      node_owner_vector));
+    std::shared_ptr p_connectivity = std::make_shared<Connectivity3D>(descriptor);
     Connectivity3D& connectivity = *p_connectivity;
 
     std::map<unsigned int, std::vector<unsigned int>> ref_faces_map;
@@ -1327,47 +1325,50 @@ GmshReader::__proceedData()
       xr[i][1] = __vertices[i][1];
       xr[i][2] = __vertices[i][2];
     }
-    m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, xr));
+    m_mesh = std::make_shared<MeshType>(p_connectivity, xr);
 
   } else if ((dimension2_mask, elementNumber)>0) {
     const size_t nb_cells = (dimension2_mask, elementNumber);
 
-    std::vector<CellType> cell_type_vector(nb_cells);
-    std::vector<int> cell_number_vector(nb_cells);
+    ConnectivityDescriptor descriptor;
+
+    descriptor.node_number_vector = __verticesNumbers;
+    descriptor.cell_type_vector.resize(nb_cells);
+    descriptor.cell_number_vector.resize(nb_cells);
+    descriptor.cell_by_node_vector.resize(nb_cells);
 
-    std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells);
     const size_t nb_triangles = __triangles.size();
     for (size_t j=0; j<nb_triangles; ++j) {
-      cell_by_node_vector[j].resize(3);
+      descriptor.cell_by_node_vector[j].resize(3);
       for (int r=0; r<3; ++r) {
-        cell_by_node_vector[j][r] = __triangles[j][r];
+        descriptor.cell_by_node_vector[j][r] = __triangles[j][r];
       }
-      cell_type_vector[j] = CellType::Triangle;
-      cell_number_vector[j] = __triangles_number[j];
+      descriptor.cell_type_vector[j] = CellType::Triangle;
+      descriptor.cell_number_vector[j] = __triangles_number[j];
     }
 
     const size_t nb_quadrangles = __quadrangles.size();
     for (size_t j=0; j<nb_quadrangles; ++j) {
       const size_t jq = j+nb_triangles;
-      cell_by_node_vector[jq].resize(4);
+      descriptor.cell_by_node_vector[jq].resize(4);
       for (int r=0; r<4; ++r) {
-        cell_by_node_vector[jq][r] = __quadrangles[j][r];
+        descriptor.cell_by_node_vector[jq][r] = __quadrangles[j][r];
       }
-      cell_type_vector[jq] = CellType::Quadrangle;
-      cell_number_vector[jq] = __quadrangles_number[j];
+      descriptor.cell_type_vector[jq] = CellType::Quadrangle;
+      descriptor.cell_number_vector[jq] = __quadrangles_number[j];
     }
 
-    std::vector<int> cell_owner_vector(nb_cells);
-    std::fill(cell_owner_vector.begin(), cell_owner_vector.end(), parallel::rank());
-    std::vector<int> node_owner_vector(node_number_vector.size());
-    std::fill(node_owner_vector.begin(), node_owner_vector.end(), parallel::rank());
-
-    std::shared_ptr<Connectivity2D> p_connectivity(new Connectivity2D(cell_by_node_vector,
-                                                                      cell_type_vector,
-                                                                      cell_number_vector,
-                                                                      node_number_vector,
-                                                                      cell_owner_vector,
-                                                                      node_owner_vector));
+    descriptor.cell_owner_vector.resize(nb_cells);
+    std::fill(descriptor.cell_owner_vector.begin(),
+              descriptor.cell_owner_vector.end(),
+              parallel::rank());
+
+    descriptor.node_owner_vector.resize(descriptor.node_number_vector.size());
+    std::fill(descriptor.node_owner_vector.begin(),
+              descriptor.node_owner_vector.end(),
+              parallel::rank());
+
+    std::shared_ptr p_connectivity = std::make_shared<Connectivity2D>(descriptor);
     Connectivity2D& connectivity = *p_connectivity;
 
     std::map<unsigned int, std::vector<unsigned int>> ref_faces_map;
@@ -1410,35 +1411,39 @@ GmshReader::__proceedData()
       xr[i][0] = __vertices[i][0];
       xr[i][1] = __vertices[i][1];
     }
-    m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, xr));
+    m_mesh = std::make_shared<MeshType>(p_connectivity, xr);
 
   } else if ((dimension1_mask, elementNumber)>0) {
     const size_t nb_cells = (dimension1_mask, elementNumber);
 
-    std::vector<CellType> cell_type_vector(nb_cells);
-    std::vector<int> cell_number_vector(nb_cells);
+    ConnectivityDescriptor descriptor;
+
+    descriptor.node_number_vector = __verticesNumbers;
+    descriptor.cell_type_vector.resize(nb_cells);
+    descriptor.cell_number_vector.resize(nb_cells);
+    descriptor.cell_by_node_vector.resize(nb_cells);
 
-    std::vector<std::vector<unsigned int>> cell_by_node_vector(nb_cells);
     for (size_t j=0; j<nb_cells; ++j) {
-      cell_by_node_vector[j].resize(2);
+      descriptor.cell_by_node_vector[j].resize(2);
       for (int r=0; r<2; ++r) {
-        cell_by_node_vector[j][r] = __edges[j][r];
+        descriptor.cell_by_node_vector[j][r] = __edges[j][r];
       }
-      cell_type_vector[j] = CellType::Line;
-      cell_number_vector[j] =  __edges_number[j];
+      descriptor.cell_type_vector[j] = CellType::Line;
+      descriptor.cell_number_vector[j] =  __edges_number[j];
     }
 
-    std::vector<int> cell_owner_vector(nb_cells);
-    std::fill(cell_owner_vector.begin(), cell_owner_vector.end(), parallel::rank());
-    std::vector<int> node_owner_vector(node_number_vector.size());
-    std::fill(node_owner_vector.begin(), node_owner_vector.end(), parallel::rank());
-
-    std::shared_ptr<Connectivity1D> p_connectivity(new Connectivity1D(cell_by_node_vector,
-                                                                      cell_type_vector,
-                                                                      cell_number_vector,
-                                                                      node_number_vector,
-                                                                      cell_owner_vector,
-                                                                      node_owner_vector));
+    descriptor.cell_owner_vector.resize(nb_cells);
+    std::fill(descriptor.cell_owner_vector.begin(),
+              descriptor.cell_owner_vector.end(),
+              parallel::rank());
+
+    descriptor.node_owner_vector.resize(descriptor.node_number_vector.size());
+    std::fill(descriptor.node_owner_vector.begin(),
+              descriptor.node_owner_vector.end(),
+              parallel::rank());
+
+
+    std::shared_ptr p_connectivity = std::make_shared<Connectivity1D>(descriptor);
     Connectivity1D& connectivity = *p_connectivity;
 
     std::map<unsigned int, std::vector<unsigned int>> ref_points_map;
@@ -1465,7 +1470,7 @@ GmshReader::__proceedData()
       xr[i][0] = __vertices[i][0];
     }
 
-    m_mesh = std::shared_ptr<IMesh>(new MeshType(p_connectivity, xr));
+    m_mesh = std::make_shared<MeshType>(p_connectivity, xr);
 
   } else {
     perr() << "*** using a dimension 0 mesh is forbidden!\n";