diff --git a/api/GenApi.py b/api/GenApi.py
index 5c9b1cbbfb0d62fe835781f8a5e2fa3a4ed05902..d132778d5ccbf7a19edd78b924cd678a33c9c371 100644
--- a/api/GenApi.py
+++ b/api/GenApi.py
@@ -745,9 +745,12 @@ def isizefun(name):
                     "            global api_" + name + "_\n" +
                     "            api_" + name + "_ = api_" + name + "_type_(" + name + ")")
     a.python_arg = "api_" + name + "_"
+    a.julia_pre = ("api_" + name + "_ = @cfunction($" + name +
+                   ", Cdouble, (Cint, Cint, Cdouble, Cdouble, Cdouble))")
+    a.julia_arg = "api_" + name + "_"
+    a.julia_ctype = "Ptr{Cvoid}"
     return a
 
-
 class Module:
     def __init__(self, name, doc):
         self.name = name
diff --git a/api/gen.py b/api/gen.py
index 6457a98eabf48634041e53c150e82739bd9a11cc..d60a18c97b5df6421837b77a7789ff63dce16003 100644
--- a/api/gen.py
+++ b/api/gen.py
@@ -378,7 +378,7 @@ doc = '''Set mesh size constraints at the given parametric points `parametricCoo
 mesh.add('setSizeAtParametricPoints', doc, None, iint('dim'), iint('tag'), ivectordouble('parametricCoord'), ivectordouble('sizes'))
 
 doc = '''Set a global mesh size callback. The callback should take 5 arguments (`dim', `tag', `x', `y' and `z') and return the value of the mesh size at coordinates (`x', `y', `z').'''
-mesh.add_special('setSizeCallback', doc, ['nojulia'], None, isizefun('callback'))
+mesh.add('setSizeCallback', doc, None, isizefun('callback'))
 
 doc = '''Remove the global mesh size callback.'''
 mesh.add('removeSizeCallback', doc, None)
diff --git a/api/gmsh.jl b/api/gmsh.jl
index 7277bef96fd128fb6edf9a26d6c2e54454240710..5f97a3f59bb78bd1e783ec3dc2a3a9f343e43b0c 100644
--- a/api/gmsh.jl
+++ b/api/gmsh.jl
@@ -2197,6 +2197,23 @@ function setSizeAtParametricPoints(dim, tag, parametricCoord, sizes)
     return nothing
 end
 
+"""
+    gmsh.model.mesh.setSizeCallback(callback)
+
+Set a global mesh size callback. The callback should take 5 arguments (`dim`,
+`tag`, `x`, `y` and `z`) and return the value of the mesh size at coordinates
+(`x`, `y`, `z`).
+"""
+function setSizeCallback(callback)
+    api_callback_ = @cfunction($callback, Cdouble, (Cint, Cint, Cdouble, Cdouble, Cdouble))
+    ierr = Ref{Cint}()
+    ccall((:gmshModelMeshSetSizeCallback, gmsh.lib), Cvoid,
+          (Ptr{Cvoid}, Ptr{Cint}),
+          api_callback_, ierr)
+    ierr[] != 0 && error(gmsh.logger.getLastError())
+    return nothing
+end
+
 """
     gmsh.model.mesh.removeSizeCallback()
 
diff --git a/doc/texinfo/api.texi b/doc/texinfo/api.texi
index e4502e2c0f504d221ecda58c6e2bdc4dc3715938..2604c032c4e9dd8b6ae81f86745ebdd4362321fb 100644
--- a/doc/texinfo/api.texi
+++ b/doc/texinfo/api.texi
@@ -1786,7 +1786,7 @@ of the mesh size at coordinates (@code{x}, @code{y}, @code{z}).
 @item Return:
 -
 @item Examples:
-C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L117,t10.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L108,t10.py})
+C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L117,t10.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L107,t10.py})
 @end table
 
 @item gmsh/model/mesh/removeSizeCallback
@@ -2247,7 +2247,7 @@ the field tag.
 @item Return:
 integer value
 @item Examples:
-C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t7.cpp#L49,t7.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L51,t10.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t11.cpp#L38,t11.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t13.cpp#L68,t13.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t17.cpp#L41,t17.cpp}, ...), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t7.py#L44,t7.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L44,t10.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t13.py#L57,t13.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t17.py#L35,t17.py}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.py#L113,adapt_mesh.py})
+C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t7.cpp#L49,t7.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L51,t10.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t11.cpp#L38,t11.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t13.cpp#L68,t13.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t17.cpp#L41,t17.cpp}, ...), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t7.py#L44,t7.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L43,t10.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t13.py#L57,t13.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t17.py#L35,t17.py}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.py#L113,adapt_mesh.py})
 @end table
 
 @item gmsh/model/mesh/field/remove
@@ -2274,7 +2274,7 @@ Set the numerical option @code{option} to value @code{value} for field
 @item Return:
 -
 @item Examples:
-C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L53,t10.cpp}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.cpp#L271,adapt_mesh.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L46,t10.py}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.py#L114,adapt_mesh.py})
+C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L53,t10.cpp}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.cpp#L271,adapt_mesh.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L45,t10.py}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.py#L114,adapt_mesh.py})
 @end table
 
 @item gmsh/model/mesh/field/setString
@@ -2288,7 +2288,7 @@ Set the string option @code{option} to value @code{value} for field @code{tag}.
 @item Return:
 -
 @item Examples:
-C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L78,t10.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t11.cpp#L39,t11.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t13.cpp#L70,t13.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L70,t10.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t13.py#L59,t13.py})
+C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L78,t10.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t11.cpp#L39,t11.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t13.cpp#L70,t13.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L69,t10.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t13.py#L59,t13.py})
 @end table
 
 @item gmsh/model/mesh/field/setNumbers
@@ -2303,7 +2303,7 @@ Set the numerical list option @code{option} to value @code{value} for field
 @item Return:
 -
 @item Examples:
-C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L52,t10.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L45,t10.py})
+C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L52,t10.cpp}), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L44,t10.py})
 @end table
 
 @item gmsh/model/mesh/field/setAsBackgroundMesh
@@ -2317,7 +2317,7 @@ Set the field @code{tag} as the background mesh size field.
 @item Return:
 -
 @item Examples:
-C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t7.cpp#L52,t7.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L113,t10.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t11.cpp#L41,t11.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t13.cpp#L73,t13.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t17.cpp#L42,t17.cpp}, ...), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t7.py#L47,t7.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L102,t10.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t13.py#L62,t13.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t17.py#L36,t17.py}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.py#L115,adapt_mesh.py})
+C++ (@url{@value{GITLAB-PREFIX}/tutorial/c++/t7.cpp#L52,t7.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t10.cpp#L113,t10.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t11.cpp#L41,t11.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t13.cpp#L73,t13.cpp}, @url{@value{GITLAB-PREFIX}/tutorial/c++/t17.cpp#L42,t17.cpp}, ...), Python (@url{@value{GITLAB-PREFIX}/tutorial/python/t7.py#L47,t7.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t10.py#L101,t10.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t13.py#L62,t13.py}, @url{@value{GITLAB-PREFIX}/tutorial/python/t17.py#L36,t17.py}, @url{@value{GITLAB-PREFIX}/demos/api/adapt_mesh.py#L115,adapt_mesh.py})
 @end table
 
 @item gmsh/model/mesh/field/setAsBoundaryLayer
diff --git a/tutorial/julia/t10.jl b/tutorial/julia/t10.jl
new file mode 100644
index 0000000000000000000000000000000000000000..ff938df81e02bcb608e87c8fc2d3ce0f2fc51253
--- /dev/null
+++ b/tutorial/julia/t10.jl
@@ -0,0 +1,74 @@
+# See the corresponding Python tutorial for detailed comments.
+
+import gmsh
+
+gmsh.initialize()
+gmsh.option.setNumber("General.Terminal", 1)
+
+gmsh.model.add("t10")
+
+lc = .15
+gmsh.model.geo.addPoint(0.0, 0.0, 0, lc, 1)
+gmsh.model.geo.addPoint(1, 0.0, 0, lc, 2)
+gmsh.model.geo.addPoint(1, 1, 0, lc, 3)
+gmsh.model.geo.addPoint(0, 1, 0, lc, 4)
+gmsh.model.geo.addPoint(0.2, .5, 0, lc, 5)
+
+gmsh.model.geo.addLine(1, 2, 1)
+gmsh.model.geo.addLine(2, 3, 2)
+gmsh.model.geo.addLine(3, 4, 3)
+gmsh.model.geo.addLine(4, 1, 4)
+
+gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 5)
+gmsh.model.geo.addPlaneSurface([5], 6)
+
+gmsh.model.geo.synchronize()
+
+gmsh.model.mesh.field.add("Distance", 1)
+gmsh.model.mesh.field.setNumbers(1, "NodesList", [5])
+gmsh.model.mesh.field.setNumber(1, "NNodesByEdge", 100)
+gmsh.model.mesh.field.setNumbers(1, "EdgesList", [2])
+
+gmsh.model.mesh.field.add("Threshold", 2)
+gmsh.model.mesh.field.setNumber(2, "IField", 1)
+gmsh.model.mesh.field.setNumber(2, "LcMin", lc / 30)
+gmsh.model.mesh.field.setNumber(2, "LcMax", lc)
+gmsh.model.mesh.field.setNumber(2, "DistMin", 0.15)
+gmsh.model.mesh.field.setNumber(2, "DistMax", 0.5)
+
+gmsh.model.mesh.field.add("MathEval", 3)
+gmsh.model.mesh.field.setString(3, "F",
+                                "Cos(4*3.14*x) * Sin(4*3.14*y) / 10 + 0.101")
+
+gmsh.model.mesh.field.add("Distance", 4)
+gmsh.model.mesh.field.setNumbers(4, "NodesList", [1])
+
+gmsh.model.mesh.field.add("MathEval", 5)
+gmsh.model.mesh.field.setString(5, "F", "F4^3 + " * string(lc / 100))
+
+gmsh.model.mesh.field.add("Box", 6)
+gmsh.model.mesh.field.setNumber(6, "VIn", lc / 15)
+gmsh.model.mesh.field.setNumber(6, "VOut", lc)
+gmsh.model.mesh.field.setNumber(6, "XMin", 0.3)
+gmsh.model.mesh.field.setNumber(6, "XMax", 0.6)
+gmsh.model.mesh.field.setNumber(6, "YMin", 0.3)
+gmsh.model.mesh.field.setNumber(6, "YMax", 0.6)
+
+gmsh.model.mesh.field.add("Min", 7)
+gmsh.model.mesh.field.setNumbers(7, "FieldsList", [2, 3, 5, 6])
+
+gmsh.model.mesh.field.setAsBackgroundMesh(7)
+
+function meshSizeCallback(dim, tag, x, y, z)
+    return 0.02 * x + 0.01
+end
+gmsh.model.mesh.setSizeCallback(meshSizeCallback)
+
+gmsh.option.setNumber("Mesh.CharacteristicLengthExtendFromBoundary", 0)
+gmsh.option.setNumber("Mesh.CharacteristicLengthFromPoints", 0)
+gmsh.option.setNumber("Mesh.CharacteristicLengthFromCurvature", 0)
+
+gmsh.model.mesh.generate(2)
+gmsh.write("t10.msh")
+
+gmsh.finalize()
diff --git a/tutorial/python/t10.py b/tutorial/python/t10.py
index df4eb4c3e3873a18ee1a6f4c629b62de901863af..b7d4270a8b183b99ff77cbaf103444327e06e449 100644
--- a/tutorial/python/t10.py
+++ b/tutorial/python/t10.py
@@ -11,7 +11,6 @@
 # size "Fields".
 
 import gmsh
-import math
 
 gmsh.initialize()
 gmsh.option.setNumber("General.Terminal", 1)