diff --git a/src/common/gmsh.cpp b/src/common/gmsh.cpp
index b70f47b2eebd55e879eb8c98e0071813cff5ce07..0aebf435b6e041f7649f8773c1c139870ce0f6a7 100644
--- a/src/common/gmsh.cpp
+++ b/src/common/gmsh.cpp
@@ -3550,7 +3550,7 @@ GMSH_API void gmsh::model::mesh::createEdges(const vectorpair &dimTags)
       MElement *e = ge->getMeshElement(j);
       for(int k = 0; k < e->getNumEdges(); k++) {
         MEdge edge = e->getEdge(k);
-        GModel::current()->addMEdge(edge);
+        GModel::current()->addMEdge(std::move(edge));
       }
     }
   }
@@ -3567,7 +3567,7 @@ GMSH_API void gmsh::model::mesh::createFaces(const vectorpair &dimTags)
       MElement *e = ge->getMeshElement(j);
       for(int k = 0; k < e->getNumFaces(); k++) {
         MFace face = e->getFace(k);
-        GModel::current()->addMFace(face);
+        GModel::current()->addMFace(std::move(face));
       }
     }
   }
@@ -3627,7 +3627,7 @@ GMSH_API void gmsh::model::mesh::addEdges(const std::vector<std::size_t> &edgeTa
       }
     }
     MEdge e(v[0], v[1]);
-    m->addMEdge(e, edgeTags[i]);
+    m->addMEdge(std::move(e), edgeTags[i]);
   }
 }
 
@@ -3655,7 +3655,7 @@ GMSH_API void gmsh::model::mesh::addFaces(const int faceType,
       }
     }
     MFace f(v[0], v[1], v[2], v[3]);
-    m->addMFace(f, faceTags[i]);
+    m->addMFace(std::move(f), faceTags[i]);
   }
 }
 
@@ -3851,7 +3851,7 @@ GMSH_API void gmsh::model::mesh::getKeys(
             coordEdge[1] = 0.5 * (v1->y() + v2->y());
             coordEdge[2] = 0.5 * (v1->z() + v2->z());
           }
-          std::size_t edgeGlobalIndice = GModel::current()->addMEdge(edge);
+          std::size_t edgeGlobalIndice = GModel::current()->addMEdge(std::move(edge));
           for(int k = 1; k < const1; k++) {
             typeKeys.push_back(k);
             entityKeys.push_back(edgeGlobalIndice);
@@ -3880,7 +3880,7 @@ GMSH_API void gmsh::model::mesh::getKeys(
             coordFace[1] /= face.getNumVertices();
             coordFace[2] /= face.getNumVertices();
           }
-          std::size_t faceGlobalIndice = GModel::current()->addMFace(face);
+          std::size_t faceGlobalIndice = GModel::current()->addMFace(std::move(face));
           int it2 = const2;
           if(jj >= numberQuadFaces) { it2 = const3; }
           for(int k = const1; k < it2; k++) {
@@ -4077,7 +4077,7 @@ GMSH_API void gmsh::model::mesh::getKeysForElement(
         coordEdge[1] = 0.5 * (v1->y() + v2->y());
         coordEdge[2] = 0.5 * (v1->z() + v2->z());
       }
-      std::size_t edgeGlobalIndice = GModel::current()->addMEdge(edge);
+      std::size_t edgeGlobalIndice = GModel::current()->addMEdge(std::move(edge));
       for(int k = 1; k < const1; k++) {
         typeKeys.push_back(k);
         entityKeys.push_back(edgeGlobalIndice);
@@ -4105,7 +4105,7 @@ GMSH_API void gmsh::model::mesh::getKeysForElement(
         coordFace[1] /= face.getNumVertices();
         coordFace[2] /= face.getNumVertices();
       }
-      std::size_t faceGlobalIndice = GModel::current()->addMFace(face);
+      std::size_t faceGlobalIndice = GModel::current()->addMFace(std::move(face));
       int it2 = const2;
       if(jj >= numberQuadFaces) { it2 = const3; }
       for(int k = const1; k < it2; k++) {
diff --git a/src/geo/GModel.cpp b/src/geo/GModel.cpp
index a556f32434c3c077f4888b5ae6d4ad691ccd3c88..05efe561bc5dce18e39e87b0a4618919f18da0f0 100644
--- a/src/geo/GModel.cpp
+++ b/src/geo/GModel.cpp
@@ -1628,7 +1628,7 @@ std::size_t GModel::getNumMeshParentElements() const
   return n;
 }
 
-std::size_t GModel::addMEdge(MEdge &edge, std::size_t num)
+std::size_t GModel::addMEdge(MEdge &&edge, std::size_t num)
 {
   std::pair<MEdge, std::size_t> key(std::move(edge),
                                     num ? num : _mapEdgeNum.size() + 1);
@@ -1650,7 +1650,7 @@ std::size_t GModel::getMEdge(MVertex *v0, MVertex *v1, MEdge &edge)
   }
 }
 
-std::size_t GModel::addMFace(MFace &face, std::size_t num)
+std::size_t GModel::addMFace(MFace &&face, std::size_t num)
 {
   std::pair<MFace, std::size_t> key(std::move(face),
                                     num ? num : _mapFaceNum.size() + 1);
diff --git a/src/geo/GModel.h b/src/geo/GModel.h
index 46db7990303b2af77e006f37fc3d909381857465..65c03be4b698c91beedb815cbc144e94af6edc8a 100644
--- a/src/geo/GModel.h
+++ b/src/geo/GModel.h
@@ -274,8 +274,8 @@ public:
 
   // add a mesh edge or face in the global edge or face map with number "num",
   // or number it (starting at 1) if num == 0
-  std::size_t addMEdge(MEdge &edge, std::size_t num = 0);
-  std::size_t addMFace(MFace &face, std::size_t num = 0);
+  std::size_t addMEdge(MEdge &&edge, std::size_t num = 0);
+  std::size_t addMFace(MFace &&face, std::size_t num = 0);
   // get the edge of face and its global number given mesh nodes (return 0 if
   // the edge or face does not exist in the edge or face map)
   std::size_t getMEdge(MVertex *v0, MVertex *v1, MEdge &edge);