diff --git a/api/GenApi.py b/api/GenApi.py
index 4874d31dfb7fd6d253f453213a58ba43161840a3..548434d1b162c4b8e2fd4a60e3ba814b3667a943 100644
--- a/api/GenApi.py
+++ b/api/GenApi.py
@@ -160,7 +160,7 @@ def ivectordouble(name, value=None, python_value=None, julia_value=None):
     if julia_value == "[]":
         julia_value = "Cdouble[]"
     a = arg(name, value, python_value, julia_value,
-            "const std::vector<double> &", "const double **", False)
+            "const std::vector<double> &", "const double * const *", False)
     api_name = "api_" + name + "_"
     api_name_n = "api_" + name + "_n_"
     a.c_pre = ("    std::vector<double> " + api_name + "(" + name + ", " +
@@ -184,13 +184,13 @@ def ivectordouble(name, value=None, python_value=None, julia_value=None):
 
 def ivectorstring(name, value=None, python_value=None, julia_value=None):
     a = arg(name, value, python_value, julia_value,
-            "const std::vector<std::string> &", "const char **", False)
+            "const std::vector<std::string> &", "const char * const *", False)
     api_name = "api_" + name + "_"
     api_name_n = "api_" + name + "_n_"
     a.c_pre = ("    std::vector<std::string> " + api_name + "(" + name + ", " +
                name + " + " + name + "_n);\n")
     a.c_arg = api_name
-    a.c = "const char ** " + name + ", const size_t " + name + "_n"
+    a.c = "const char * const * " + name + ", const size_t " + name + "_n"
     a.cwrap_pre = ("char **" + api_name + "; size_t " + api_name_n + "; " +
                    "vectorstring2charptrptr(" + name + ", &" + api_name +
                    ", &" + api_name_n + ");\n")
@@ -243,7 +243,7 @@ def ivectorvectorint(name, value=None, python_value=None, julia_value=None):
     if julia_value == "[]":
         julia_value = "Vector{Cint}[]"
     a = arg(name, value, python_value, julia_value,
-            "const std::vector<std::vector<int> > &", "const int **", False)
+            "const std::vector<std::vector<int> > &", "const int * const *", False)
     api_name = "api_" + name + "_"
     api_name_n = "api_" + name + "_n_"
     api_name_nn = "api_" + name + "_nn_"
@@ -253,13 +253,13 @@ def ivectorvectorint(name, value=None, python_value=None, julia_value=None):
                "[i] = std::vector<int>(" + name + "[i], " + name + "[i] + " +
                name + "_n[i]);\n")
     a.c_arg = api_name
-    a.c = ("const int ** " + name + ", const size_t * " + name + "_n, " +
+    a.c = ("const int * const * " + name + ", const size_t * " + name + "_n, " +
            "const size_t " + name + "_nn")
     a.cwrap_pre = ("int **" + api_name + "; size_t *" + api_name_n + ", " +
                    api_name_nn + "; " + "vectorvector2ptrptr(" + name + ", &" +
                    api_name + ", &" + api_name_n + ", &" + api_name_nn +
                    ");\n")
-    a.cwrap_arg = "(const int **)" + api_name + ", " + api_name_n + ", " + api_name_nn
+    a.cwrap_arg = api_name + ", " + api_name_n + ", " + api_name_nn
     a.cwrap_post = ("for(size_t i = 0; i < " + api_name_nn + "; ++i){ " + ns +
                     "Free(" + api_name + "[i]); } " + ns + "Free(" + api_name +
                     "); " + ns + "Free(" + api_name_n + ");\n")
@@ -283,7 +283,7 @@ def ivectorvectorsize(name, value=None, python_value=None, julia_value=None):
         julia_value = "Vector{Csize_t}[]"
     a = arg(name, value, python_value, julia_value,
             "const std::vector<std::vector<std::size_t> > &",
-            "const size_t **", False)
+            "const size_t * const *", False)
     api_name = "api_" + name + "_"
     api_name_n = "api_" + name + "_n_"
     api_name_nn = "api_" + name + "_nn_"
@@ -293,13 +293,13 @@ def ivectorvectorsize(name, value=None, python_value=None, julia_value=None):
                "[i] = std::vector<std::size_t>(" + name + "[i], " + name +
                "[i] + " + name + "_n[i]);\n")
     a.c_arg = api_name
-    a.c = ("const size_t ** " + name + ", const size_t * " + name + "_n, " +
+    a.c = ("const size_t * const * " + name + ", const size_t * " + name + "_n, " +
            "const size_t " + name + "_nn")
     a.cwrap_pre = ("size_t **" + api_name + "; size_t *" + api_name_n + ", " +
                    api_name_nn + "; " + "vectorvector2ptrptr(" + name + ", &" +
                    api_name + ", &" + api_name_n + ", &" + api_name_nn +
                    ");\n")
-    a.cwrap_arg = "(const size_t **)" + api_name + ", " + api_name_n + ", " + api_name_nn
+    a.cwrap_arg = api_name + ", " + api_name_n + ", " + api_name_nn
     a.cwrap_post = ("for(size_t i = 0; i < " + api_name_nn + "; ++i){ " + ns +
                     "Free(" + api_name + "[i]); } " + ns + "Free(" + api_name +
                     "); " + ns + "Free(" + api_name_n + ");\n")
@@ -322,7 +322,7 @@ def ivectorvectordouble(name, value=None, python_value=None, julia_value=None):
     if julia_value == "[]":
         julia_value = "Vector{Cdouble}[]"
     a = arg(name, value, python_value, julia_value,
-            "const std::vector<std::vector<double> > &", "const double**",
+            "const std::vector<std::vector<double> > &", "const double * const *",
             False)
     api_name = "api_" + name + "_"
     api_name_n = "api_" + name + "_n_"
@@ -333,13 +333,13 @@ def ivectorvectordouble(name, value=None, python_value=None, julia_value=None):
                "[i] = std::vector<double>(" + name + "[i], " + name +
                "[i] + " + name + "_n[i]);\n")
     a.c_arg = api_name
-    a.c = ("const double ** " + name + ", const size_t * " + name + "_n, " +
+    a.c = ("const double * const * " + name + ", const size_t * " + name + "_n, " +
            "const size_t " + name + "_nn")
     a.cwrap_pre = ("double **" + api_name + "; size_t *" + api_name_n + ", " +
                    api_name_nn + "; " + "vectorvector2ptrptr(" + name + ", &" +
                    api_name + ", &" + api_name_n + ", &" + api_name_nn +
                    ");\n")
-    a.cwrap_arg = "(const double **)" + api_name + ", " + api_name_n + ", " + api_name_nn
+    a.cwrap_arg = api_name + ", " + api_name_n + ", " + api_name_nn
     a.cwrap_post = ("for(size_t i = 0; i < " + api_name_nn + "; ++i){ " + ns +
                     "Free(" + api_name + "[i]); } " + ns + "Free(" + api_name +
                     "); " + ns + "Free(" + api_name_n + ");\n")
diff --git a/api/gmsh.h_cwrap b/api/gmsh.h_cwrap
index ab62305f17ba4e7c4ff125a3eafc03c66e8e1c3e..8a13954d2cc2a5443bfb2f555a53354207b6300d 100644
--- a/api/gmsh.h_cwrap
+++ b/api/gmsh.h_cwrap
@@ -1499,7 +1499,7 @@ namespace gmsh { // Top-level functions
         int *api_elementTypes_; size_t api_elementTypes_n_; vector2ptr(elementTypes, &api_elementTypes_, &api_elementTypes_n_);
         size_t **api_elementTags_; size_t *api_elementTags_n_, api_elementTags_nn_; vectorvector2ptrptr(elementTags, &api_elementTags_, &api_elementTags_n_, &api_elementTags_nn_);
         size_t **api_nodeTags_; size_t *api_nodeTags_n_, api_nodeTags_nn_; vectorvector2ptrptr(nodeTags, &api_nodeTags_, &api_nodeTags_n_, &api_nodeTags_nn_);
-        gmshModelMeshAddElements(dim, tag, api_elementTypes_, api_elementTypes_n_, (const size_t **)api_elementTags_, api_elementTags_n_, api_elementTags_nn_, (const size_t **)api_nodeTags_, api_nodeTags_n_, api_nodeTags_nn_, &ierr);
+        gmshModelMeshAddElements(dim, tag, api_elementTypes_, api_elementTypes_n_, api_elementTags_, api_elementTags_n_, api_elementTags_nn_, api_nodeTags_, api_nodeTags_n_, api_nodeTags_nn_, &ierr);
         if(ierr) throwLastError();
         gmshFree(api_elementTypes_);
         for(size_t i = 0; i < api_elementTags_nn_; ++i){ gmshFree(api_elementTags_[i]); } gmshFree(api_elementTags_); gmshFree(api_elementTags_n_);
@@ -4783,7 +4783,7 @@ namespace gmsh { // Top-level functions
       int ierr = 0;
       size_t *api_tags_; size_t api_tags_n_; vector2ptr(tags, &api_tags_, &api_tags_n_);
       double **api_data_; size_t *api_data_n_, api_data_nn_; vectorvector2ptrptr(data, &api_data_, &api_data_n_, &api_data_nn_);
-      gmshViewAddModelData(tag, step, modelName.c_str(), dataType.c_str(), api_tags_, api_tags_n_, (const double **)api_data_, api_data_n_, api_data_nn_, time, numComponents, partition, &ierr);
+      gmshViewAddModelData(tag, step, modelName.c_str(), dataType.c_str(), api_tags_, api_tags_n_, api_data_, api_data_n_, api_data_nn_, time, numComponents, partition, &ierr);
       if(ierr) throwLastError();
       gmshFree(api_tags_);
       for(size_t i = 0; i < api_data_nn_; ++i){ gmshFree(api_data_[i]); } gmshFree(api_data_); gmshFree(api_data_n_);
diff --git a/api/gmshc.cpp b/api/gmshc.cpp
index 49de165f88bfb14bd41b4a1ca8e6285c0bc735c4..4cabf493566b0caf21235a340314ec3e1a33221e 100644
--- a/api/gmshc.cpp
+++ b/api/gmshc.cpp
@@ -1307,7 +1307,7 @@ GMSH_API void gmshModelMeshPreallocateElementsByType(const int elementType, cons
   }
 }
 
-GMSH_API void gmshModelMeshAddElements(const int dim, const int tag, const int * elementTypes, const size_t elementTypes_n, const size_t ** elementTags, const size_t * elementTags_n, const size_t elementTags_nn, const size_t ** nodeTags, const size_t * nodeTags_n, const size_t nodeTags_nn, int * ierr)
+GMSH_API void gmshModelMeshAddElements(const int dim, const int tag, const int * elementTypes, const size_t elementTypes_n, const size_t * const * elementTags, const size_t * elementTags_n, const size_t elementTags_nn, const size_t * const * nodeTags, const size_t * nodeTags_n, const size_t nodeTags_nn, int * ierr)
 {
   if(ierr) *ierr = 0;
   try {
@@ -4007,7 +4007,7 @@ GMSH_API void gmshViewGetTags(int ** tags, size_t * tags_n, int * ierr)
   }
 }
 
-GMSH_API void gmshViewAddModelData(const int tag, const int step, const char * modelName, const char * dataType, const size_t * tags, const size_t tags_n, const double ** data, const size_t * data_n, const size_t data_nn, const double time, const int numComponents, const int partition, int * ierr)
+GMSH_API void gmshViewAddModelData(const int tag, const int step, const char * modelName, const char * dataType, const size_t * tags, const size_t tags_n, const double * const * data, const size_t * data_n, const size_t data_nn, const double time, const int numComponents, const int partition, int * ierr)
 {
   if(ierr) *ierr = 0;
   try {
@@ -4081,7 +4081,7 @@ GMSH_API void gmshViewGetListData(const int tag, char *** dataType, size_t * dat
   }
 }
 
-GMSH_API void gmshViewAddListDataString(const int tag, const double * coord, const size_t coord_n, const char ** data, const size_t data_n, const char ** style, const size_t style_n, int * ierr)
+GMSH_API void gmshViewAddListDataString(const int tag, const double * coord, const size_t coord_n, const char * const * data, const size_t data_n, const char * const * style, const size_t style_n, int * ierr)
 {
   if(ierr) *ierr = 0;
   try {
@@ -4540,7 +4540,7 @@ GMSH_API void gmshParserSetNumber(const char * name, const double * value, const
   }
 }
 
-GMSH_API void gmshParserSetString(const char * name, const char ** value, const size_t value_n, int * ierr)
+GMSH_API void gmshParserSetString(const char * name, const char * const * value, const size_t value_n, int * ierr)
 {
   if(ierr) *ierr = 0;
   try {
@@ -4649,7 +4649,7 @@ GMSH_API void gmshOnelabSetNumber(const char * name, const double * value, const
   }
 }
 
-GMSH_API void gmshOnelabSetString(const char * name, const char ** value, const size_t value_n, int * ierr)
+GMSH_API void gmshOnelabSetString(const char * name, const char * const * value, const size_t value_n, int * ierr)
 {
   if(ierr) *ierr = 0;
   try {
diff --git a/api/gmshc.h b/api/gmshc.h
index 5660fd28bde551645c1c0c0883deb6ae1d39034b..1297c283f98cfa24eeec1262980c6233739049ba 100644
--- a/api/gmshc.h
+++ b/api/gmshc.h
@@ -851,8 +851,8 @@ GMSH_API void gmshModelMeshPreallocateElementsByType(const int elementType,
 GMSH_API void gmshModelMeshAddElements(const int dim,
                                        const int tag,
                                        const int * elementTypes, const size_t elementTypes_n,
-                                       const size_t ** elementTags, const size_t * elementTags_n, const size_t elementTags_nn,
-                                       const size_t ** nodeTags, const size_t * nodeTags_n, const size_t nodeTags_nn,
+                                       const size_t * const * elementTags, const size_t * elementTags_n, const size_t elementTags_nn,
+                                       const size_t * const * nodeTags, const size_t * nodeTags_n, const size_t nodeTags_nn,
                                        int * ierr);
 
 /* Add elements of type `elementType' classified on the entity of tag `tag'.
@@ -2815,7 +2815,7 @@ GMSH_API void gmshViewAddModelData(const int tag,
                                    const char * modelName,
                                    const char * dataType,
                                    const size_t * tags, const size_t tags_n,
-                                   const double ** data, const size_t * data_n, const size_t data_nn,
+                                   const double * const * data, const size_t * data_n, const size_t data_nn,
                                    const double time,
                                    const int numComponents,
                                    const int partition,
@@ -2903,8 +2903,8 @@ GMSH_API void gmshViewGetListData(const int tag,
  * "CenterCenter", "CenterRight"). */
 GMSH_API void gmshViewAddListDataString(const int tag,
                                         const double * coord, const size_t coord_n,
-                                        const char ** data, const size_t data_n,
-                                        const char ** style, const size_t style_n,
+                                        const char * const * data, const size_t data_n,
+                                        const char * const * style, const size_t style_n,
                                         int * ierr);
 
 /* Get list-based post-processing data strings (2D strings if `dim' = 2, 3D
@@ -3168,7 +3168,7 @@ GMSH_API void gmshParserSetNumber(const char * name,
 /* Set the value of the string variable `name' in the Gmsh parser. Create the
  * variable if it does not exist; update the value if the variable exists. */
 GMSH_API void gmshParserSetString(const char * name,
-                                  const char ** value, const size_t value_n,
+                                  const char * const * value, const size_t value_n,
                                   int * ierr);
 
 /* Get the value of the number variable `name' from the Gmsh parser. Return an
@@ -3221,7 +3221,7 @@ GMSH_API void gmshOnelabSetNumber(const char * name,
  * the parameter if it does not exist; update the value if the parameter
  * exists. */
 GMSH_API void gmshOnelabSetString(const char * name,
-                                  const char ** value, const size_t value_n,
+                                  const char * const * value, const size_t value_n,
                                   int * ierr);
 
 /* Get the value of the number parameter `name' from the ONELAB database.