diff --git a/benchmarks/extrude/periodic_extruded_layers.geo b/benchmarks/extrude/periodic_extruded_layers.geo
index c1530daa64d3015695e797ff927a20af6c85ad2d..4cc8960636533263a599c648cda1d3b82d86092a 100644
--- a/benchmarks/extrude/periodic_extruded_layers.geo
+++ b/benchmarks/extrude/periodic_extruded_layers.geo
@@ -6,6 +6,6 @@ s[] = Extrude{0, 1, 0} { Line{l[1]};
   Layers{10}; Recombine;
 };
 
-// explicit periodic constraint to store node correspondance on the extruded
+// explicit periodic constraint to store node correspondence on the extruded
 // entity, even for a structured mesh
 Periodic Line{s[0]} = {l[1]} Translate{0, 1, 0};
diff --git a/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp b/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp
index 3f16dc8c6b72bc9e44fdc4f58039dbab7d99656a..35494edad14c55679bef950e61d6bb5376205d6c 100644
--- a/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp
+++ b/contrib/HighOrderMeshOptimizer/HighOrderMeshFastCurving.cpp
@@ -452,7 +452,7 @@ namespace {
       }
     }
 
-    // Build top face from max face (with right correspondance)
+    // Build top face from max face (with right correspondence)
     MVertex *maxVert[3] = {elMaxFace.getVertex(0), elMaxFace.getVertex(1),
                            elMaxFace.getVertex(2)};
     std::vector<MVertex *> topVert(3, static_cast<MVertex *>(nullptr));
diff --git a/contrib/QuadMeshingTools/qmtCrossField.cpp b/contrib/QuadMeshingTools/qmtCrossField.cpp
index 5f36bb0542273bcc377562ead1d03b4184e1b129..ad4febf001fecf80c96216e563b75de98d32ff41 100644
--- a/contrib/QuadMeshingTools/qmtCrossField.cpp
+++ b/contrib/QuadMeshingTools/qmtCrossField.cpp
@@ -580,7 +580,7 @@ namespace QMT {
     vector<double> x(2 * uIEdges.size(), 0.);
 
     /* Initial Dirichlet boundary conditions
-     * alignement of crosses with edges (relative angle = 0)
+     * alignment of crosses with edges (relative angle = 0)
      * theta_e = 0 => (cos4t/sin4t) = (1,0) */
     size_t nbc = 0;
     vector<bool> dirichletEdge(uIEdges.size(), false);
diff --git a/examples/api/onelab_run.py b/examples/api/onelab_run.py
index 75c0e1838e21a6a6512715142184230a879be6f6..9af3178ad50de617397b1945e969c24e848658a2 100644
--- a/examples/api/onelab_run.py
+++ b/examples/api/onelab_run.py
@@ -3,7 +3,7 @@ import threading
 import sys
 
 # This shows how ONELAB clients that communicate with the ONELAB server through
-# sockets can be executed using the Gmsh API, by explicitely specying the
+# sockets can be executed using the Gmsh API, by explicitly specying the
 # command to run the client
 
 # One such example is the GetDP finite element solver (https://getdp.info).
diff --git a/examples/api/tube_boundary_layer.py b/examples/api/tube_boundary_layer.py
new file mode 100644
index 0000000000000000000000000000000000000000..410708aa78e5652b74e8406b3f7f2a25e042839a
--- /dev/null
+++ b/examples/api/tube_boundary_layer.py
@@ -0,0 +1,58 @@
+import gmsh
+import sys
+import math
+import numpy as np
+
+gmsh.initialize(sys.argv)
+gmsh.model.add("Tube boundary layer")
+
+# meshing constraints
+gmsh.option.setNumber("Mesh.MeshSizeMax", 0.1)
+order2 = False
+
+# fuse 2 cylinders and only keep outside shell
+c1 = gmsh.model.occ.addCylinder(0,0,0, 5,0,0, 0.5)
+c2 = gmsh.model.occ.addCylinder(2,0,-2, 0,0,2, 0.3)
+s = gmsh.model.occ.fuse([(3, c1)], [(3, c2)])
+gmsh.model.occ.remove(gmsh.model.occ.getEntities(3))
+gmsh.model.occ.remove([(2,2), (2,3), (2,5)]) # fixme: automate this
+gmsh.model.occ.synchronize()
+
+# create boundary layer extrusion, and make extrusion only return "top" surfaces
+# and volumes, not lateral surfaces
+gmsh.option.setNumber('Geometry.ExtrudeReturnLateralEntities', 0)
+n = np.linspace(1, 1, 5)
+d = np.logspace(-3, -1, 5)
+e = gmsh.model.geo.extrudeBoundaryLayer(gmsh.model.getEntities(2),
+                                        n, -d, True)
+
+# get "top" surfaces created by extrusion
+top_ent = [s for s in e if s[0] == 2]
+top_surf = [s[1] for s in top_ent]
+
+# get boundary of top surfaces, i.e. boundaries of holes
+gmsh.model.geo.synchronize()
+bnd_ent = gmsh.model.getBoundary(top_ent)
+bnd_curv = [c[1] for c in bnd_ent]
+
+# create plane surfaces filling the holes
+loops = gmsh.model.geo.addCurveLoops(bnd_curv)
+for l in loops:
+    top_surf.append(gmsh.model.geo.addPlaneSurface([l]))
+
+# create the inner volume
+gmsh.model.geo.addVolume([gmsh.model.geo.addSurfaceLoop(top_surf)])
+gmsh.model.geo.synchronize()
+
+# generate the mesh
+gmsh.model.mesh.generate(3)
+
+# 2nd order + fast curving of the boundary layer
+if order2:
+    gmsh.model.mesh.setOrder(2)
+    gmsh.model.mesh.optimize('HighOrderFastCurving')
+
+if '-nopopup' not in sys.argv:
+    gmsh.fltk.run()
+
+gmsh.finalize()
diff --git a/src/geo/CGNSZoneStruct.cpp b/src/geo/CGNSZoneStruct.cpp
index b62d729ff72f072a7184e44cdc17e38d7dd46f55..c709822fccef398be53b2c784dd3727873267905 100644
--- a/src/geo/CGNSZoneStruct.cpp
+++ b/src/geo/CGNSZoneStruct.cpp
@@ -606,7 +606,7 @@ int CGNSZoneStruct<DIM>::readOneInterface(
   // zone.masterVert.push_back(std::vector<MVertex *>());
   // zone.masterVert.back().reserve(nbNode);
 
-  // // store periodic node correspondance
+  // // store periodic node correspondence
   // int ijk[3], ijkD[3];
   // for(int k = 0; k < nijk[2]; k++) {
   //   ijk[2] = ijkMin[2] + k;
diff --git a/src/geo/GModel.cpp b/src/geo/GModel.cpp
index d671ab19fe326cf9fb0e0c74f184efc73cf8440b..2b9b42ec6593330aca3d83658d8e1670f04c271e 100644
--- a/src/geo/GModel.cpp
+++ b/src/geo/GModel.cpp
@@ -2944,9 +2944,8 @@ void GModel::alignPeriodicBoundaries()
 
           if(!tgtFace.computeCorrespondence(srcFace, rotation, swap)) {
             Msg::Debug(
-              "Could not find correspondance between mesh face %d-%d-%d "
-              "(slave) "
-              "and %d-%d-%d (master)",
+              "Could not find correspondence between mesh face %d-%d-%d "
+              "(slave) and %d-%d-%d (master)",
               tgtElmt->getVertex(0)->getNum(), tgtElmt->getVertex(1)->getNum(),
               tgtElmt->getVertex(2)->getNum(), srcElmt->getVertex(0)->getNum(),
               srcElmt->getVertex(1)->getNum(), srcElmt->getVertex(2)->getNum());
diff --git a/src/geo/GModelIO_MSH4.cpp b/src/geo/GModelIO_MSH4.cpp
index 83b8e2a6394dab23491bd933cd1f6161548f1193..0fd59119e2391e8dd3d4450031e19fcb274e7881 100644
--- a/src/geo/GModelIO_MSH4.cpp
+++ b/src/geo/GModelIO_MSH4.cpp
@@ -2517,7 +2517,7 @@ static void writeMSH4Elements(GModel *const model, FILE *fp, bool partitioned,
 static void writeMSH4PeriodicNodes(GModel *const model, FILE *fp,
                                    bool binary, double version)
 {
-  // To avoid saving correspondances bwteen nodes that are not saved (either in
+  // To avoid saving correspondences bwteen nodes that are not saved (either in
   // the same file or not at all, e.g. in the partitioned case, or simply if
   // some physical entities are not defined), we could only apply the code below
   // to the entities returned by getEntitiesForNodes().
diff --git a/src/geo/GModelIO_OCC.cpp b/src/geo/GModelIO_OCC.cpp
index 7d08ebeee063c702117882172f43f4e6b59940d5..2db336bb290da98498168cfa5b6fe7c32ed5c250 100644
--- a/src/geo/GModelIO_OCC.cpp
+++ b/src/geo/GModelIO_OCC.cpp
@@ -3633,7 +3633,7 @@ bool OCC_Internals::booleanOperator(
     _toPreserve.clear();
   }
 
-  // return input/output correspondance maps
+  // return input/output correspondence maps
   for(std::size_t i = 0; i < inDimTags.size(); i++) {
     int dim = inDimTags[i].first;
     int tag = inDimTags[i].second;
diff --git a/src/mesh/Generator.cpp b/src/mesh/Generator.cpp
index 85c1dc4a18d497bef3efe933dee1ccfdd2b5ef95..15cbaf84e52168bcd17fef75cb385a887a685528 100644
--- a/src/mesh/Generator.cpp
+++ b/src/mesh/Generator.cpp
@@ -1600,7 +1600,7 @@ void GenerateMesh(GModel *m, int ask)
   }
 
   // make sure periodic meshes are actually periodic and store periodic node
-  // correspondances
+  // correspondences
   FixPeriodicMesh(m);
 
   Msg::Info("%d nodes %d elements", m->getNumMeshVertices(),
diff --git a/src/mesh/meshGEdgeExtruded.cpp b/src/mesh/meshGEdgeExtruded.cpp
index 515b5feaa49c43963380a16a71e8686a61147332..c493be60f21b93477b307a4522cbe89ce1194180 100644
--- a/src/mesh/meshGEdgeExtruded.cpp
+++ b/src/mesh/meshGEdgeExtruded.cpp
@@ -121,7 +121,7 @@ int MeshExtrudedCurve(GEdge *ge)
 
     copyMesh(from, ge);
     if(ge->getMeshMaster() == from) {
-      // explicit periodic constraint, to store node correspondance
+      // explicit periodic constraint, to store node correspondence
       ge->setMeshMaster(from, ge->affineTransform);
     }
   }
diff --git a/src/mesh/meshGFaceExtruded.cpp b/src/mesh/meshGFaceExtruded.cpp
index 3e6b2454cf6ac94aeda7eacd9ece27b32549f3fe..c94dca01e0e9df21df9e41ee8eb3ed580197e30f 100644
--- a/src/mesh/meshGFaceExtruded.cpp
+++ b/src/mesh/meshGFaceExtruded.cpp
@@ -334,7 +334,7 @@ int MeshExtrudedSurface(
     }
     copyMesh(from, gf, pos);
     if(gf->getMeshMaster() == from) {
-      // explicit periodic constraint, to store node correspondance
+      // explicit periodic constraint, to store node correspondence
       gf->setMeshMaster(from, gf->affineTransform);
     }
   }
diff --git a/src/mesh/meshGFacePack.cpp b/src/mesh/meshGFacePack.cpp
index cffc059cd467d590d13a1ab549188b0c8d9528a6..623af7401d9e16fdd6e3bd2842400a29ef2d99e0 100644
--- a/src/mesh/meshGFacePack.cpp
+++ b/src/mesh/meshGFacePack.cpp
@@ -189,10 +189,10 @@ static double closest(double t, double u)
   return u + 2 * D;
 }
 
-static double p2triangle_alignement_quality_measure(double *xa, double *xb,
-                                                    double *xc, double *xab,
-                                                    double *xbc, double *xca,
-                                                    int VIEW_TAG)
+static double p2triangle_alignment_quality_measure(double *xa, double *xb,
+                                                   double *xc, double *xab,
+                                                   double *xbc, double *xca,
+                                                   int VIEW_TAG)
 {
   double xis[6] = {0, .2, .4, .6, .8, 1};
   double etas[6] = {0, 0, 0, 0., 0., 0.};
@@ -623,7 +623,7 @@ triangleQualityP2(int VIEW_TAG, PolyMesh::HalfEdge *hea,
 
   double validity = triangleValidityP2(hea, midPoints);
   if(validity < 0) return validity;
-  return p2triangle_alignement_quality_measure(
+  return p2triangle_alignment_quality_measure(
     hea->v->position, heb->v->position, hec->v->position, ab, bc, ca, VIEW_TAG);
 }
 
@@ -786,7 +786,7 @@ double bestParabola(double x0, double y0, double x1, double y1, double &xmid,
     double xi = XI_MIN + (XI_MAX - XI_MIN) * t;
     SPoint2 X(xmid - xi * direction[0], ymid - xi * direction[1]);
     double Q =
-      p2triangle_alignement_quality_measure(P0, P1, P0, PM, PM, PM, VIEW_TAG);
+      p2triangle_alignment_quality_measure(P0, P1, P0, PM, PM, PM, VIEW_TAG);
     if(Q > QMAX) {
       QMAX = Q;
       CUR = X;
diff --git a/src/mesh/meshRefine.cpp b/src/mesh/meshRefine.cpp
index a5f07c29ab6fe1a0de85e0dab5c481bbae9d46cf..c57ce845cc7d6c7c8f8ad354ced6368149c7598f 100644
--- a/src/mesh/meshRefine.cpp
+++ b/src/mesh/meshRefine.cpp
@@ -480,7 +480,7 @@ void RefineMesh(GModel *m, bool linear, bool splitIntoQuads,
   if(CTX::instance()->mesh.hoOptimize == 4)
     OptimizeMesh(m, "HighOrderFastCurving");
 
-  // store periodic node correspondances
+  // store periodic node correspondences
   FixPeriodicMesh(m);
 
   // only used when splitting tets into hexes
diff --git a/src/plugin/VoroMetal.cpp b/src/plugin/VoroMetal.cpp
index 859d3879dbf4f9f1a358ceb9c455788351fcdfb8..5b9bacd5b4374454ffd33422a272afc42a78d7df 100644
--- a/src/plugin/VoroMetal.cpp
+++ b/src/plugin/VoroMetal.cpp
@@ -464,7 +464,7 @@ void voroMetal3D::print_geo_face_loop(int index, std::vector<int> &indices,
   file << "};\n";
 }
 
-void voroMetal3D::correspondance(double e, double xMax, double yMax,
+void voroMetal3D::correspondence(double e, double xMax, double yMax,
                                  double zMax)
 {
   std::size_t i;
@@ -573,7 +573,7 @@ void voroMetal3D::correspondance(double e, double xMax, double yMax,
       delta_y = std::abs(p2.y() - p1.y());
       delta_z = std::abs(p2.z() - p1.z());
       flag =
-        correspondance(delta_x, delta_y, delta_z, e, val, xMax, yMax, zMax);
+        correspondence(delta_x, delta_y, delta_z, e, val, xMax, yMax, zMax);
       if(flag) {
         it5 = markings.find(faces[i]);
         it6 = markings.find(faces[j]);
@@ -843,17 +843,17 @@ void voroMetal3D::correspondance(double e, double xMax, double yMax,
       for(it8 = edges2.begin(); it8 != edges2.end(); it8++, it10++) {
         v3 = (*it8)->getBeginVertex();
         v4 = (*it8)->getEndVertex();
-        correspondance(fabs(v3->x() - v1->x()), fabs(v3->y() - v1->y()),
+        correspondence(fabs(v3->x() - v1->x()), fabs(v3->y() - v1->y()),
                        fabs(v3->z() - v1->z()), e, categories[i], flag1, xMax,
                        yMax, zMax);
-        correspondance(fabs(v4->x() - v2->x()), fabs(v4->y() - v2->y()),
+        correspondence(fabs(v4->x() - v2->x()), fabs(v4->y() - v2->y()),
                        fabs(v4->z() - v2->z()), e, categories[i], flag2, xMax,
                        yMax, zMax);
 
-        correspondance(fabs(v4->x() - v1->x()), fabs(v4->y() - v1->y()),
+        correspondence(fabs(v4->x() - v1->x()), fabs(v4->y() - v1->y()),
                        fabs(v4->z() - v1->z()), e, categories[i], flag3, xMax,
                        yMax, zMax);
-        correspondance(fabs(v3->x() - v2->x()), fabs(v3->y() - v2->y()),
+        correspondence(fabs(v3->x() - v2->x()), fabs(v3->y() - v2->y()),
                        fabs(v3->z() - v2->z()), e, categories[i], flag4, xMax,
                        yMax, zMax);
         if(flag1 && flag2) {
@@ -917,7 +917,7 @@ void voroMetal3D::correspondance(double e, double xMax, double yMax,
   file4 << "};\n";
 }
 
-bool voroMetal3D::correspondance(double delta_x, double delta_y, double delta_z,
+bool voroMetal3D::correspondence(double delta_x, double delta_y, double delta_z,
                                  double e, int &val, double xMax, double yMax,
                                  double zMax)
 {
@@ -966,7 +966,7 @@ bool voroMetal3D::correspondance(double delta_x, double delta_y, double delta_z,
   return flag;
 }
 
-void voroMetal3D::correspondance(double delta_x, double delta_y, double delta_z,
+void voroMetal3D::correspondence(double delta_x, double delta_y, double delta_z,
                                  double e, int val, bool &flag, double xMax,
                                  double yMax, double zMax)
 {
@@ -1046,7 +1046,7 @@ static void microstructure(const char *filename)
     vm1.execute(properties, radical, 0.1, xMax, yMax, zMax);
     GModel::current()->load("MicrostructurePolycrystal3D.geo");
     voroMetal3D vm2;
-    vm2.correspondance(0.00001, xMax, yMax, zMax);
+    vm2.correspondence(0.00001, xMax, yMax, zMax);
   }
 }
 
@@ -1349,7 +1349,7 @@ static void computeBestSeeds(const char *filename)
     vm1.execute(properties, radical, 0.1, xMax, yMax, zMax);
     GModel::current()->load("MicrostructurePolycrystal3D.geo");
     voroMetal3D vm2;
-    vm2.correspondance(0.00001, xMax, yMax, zMax);
+    vm2.correspondence(0.00001, xMax, yMax, zMax);
     for(std::size_t iTmp = 0; iTmp < listDistances.size(); iTmp++) {
       std::cout << "distMinGlobal " << iTmp << " egale a "
                 << listDistances[iTmp] << std::endl;
diff --git a/src/plugin/VoroMetal.h b/src/plugin/VoroMetal.h
index 94c046e427a469eec088856badec794890100919..d4c37d976bd014f4d361b7182b3d6e321add83f1 100644
--- a/src/plugin/VoroMetal.h
+++ b/src/plugin/VoroMetal.h
@@ -59,10 +59,10 @@ public:
   void print_geo_line_loop(int, std::vector<int> &, std::vector<int> &,
                            std::ofstream &);
   void print_geo_face_loop(int, std::vector<int> &, std::ofstream &);
-  void correspondance(double, double, double, double);
-  bool correspondance(double, double, double, double, int &, double, double,
+  void correspondence(double, double, double, double);
+  bool correspondence(double, double, double, double, int &, double, double,
                       double);
-  void correspondance(double, double, double, double, int, bool &, double,
+  void correspondence(double, double, double, double, int, bool &, double,
                       double, double);
   bool equal(double, double, double);
 };
diff --git a/tutorials/c++/x4.cpp b/tutorials/c++/x4.cpp
index da5a23c5cbc7cde19d17c788a62abff305447b49..e7b8eb24e69ff4194b7d844fe1adf27238b03929 100644
--- a/tutorials/c++/x4.cpp
+++ b/tutorials/c++/x4.cpp
@@ -18,7 +18,7 @@ int main(int argc, char **argv)
   // one model (per step). Post-processing data stored in MSH files create such
   // model-based views.
 
-  // Let's create a first model-based view using a simple mesh contructed by
+  // Let's create a first model-based view using a simple mesh constructed by
   // hand. We create a model with a discrete surface
   gmsh::model::add("simple model");
   int surf = gmsh::model::addDiscreteEntity(2);
diff --git a/tutorials/python/x4.py b/tutorials/python/x4.py
index 04f1213230e59d44b08484e44297c12175178b5f..f85ce367f9876f794738011b4655e1687bc2a5cc 100644
--- a/tutorials/python/x4.py
+++ b/tutorials/python/x4.py
@@ -16,7 +16,7 @@ gmsh.initialize(sys.argv)
 # model (per step). Post-processing data stored in MSH files create such
 # model-based views.
 
-# Let's create a first model-based view using a simple mesh contructed by
+# Let's create a first model-based view using a simple mesh constructed by
 # hand. We create a model with a discrete surface
 gmsh.model.add("simple model")
 surf = gmsh.model.addDiscreteEntity(2)