diff --git a/utils/api_demos/CMakeLists.txt b/utils/api_demos/CMakeLists.txt
index b10031326e7f059ee6b9469c322f898e7cb7e4cb..8fc105af2fbd6e492c80dcb6f5c4f2ebc8fabbc7 100644
--- a/utils/api_demos/CMakeLists.txt
+++ b/utils/api_demos/CMakeLists.txt
@@ -53,3 +53,6 @@ target_link_libraries(mainPost shared)
 add_executable(mainSimple mainSimple.cpp)
 target_link_libraries(mainSimple shared)
 
+add_executable(mainGeoFactory mainGeoFactory.cpp)
+target_link_libraries(mainGeoFactory shared)
+
diff --git a/utils/api_demos/mainElasticity.cpp b/utils/api_demos/mainElasticity.cpp
index 68236fcddda855edab7f6b4aa2234e0601cad119..b056d0ac6b8ef1d41cd61f642e90fe1d18767639 100644
--- a/utils/api_demos/mainElasticity.cpp
+++ b/utils/api_demos/mainElasticity.cpp
@@ -28,7 +28,7 @@ void InitializeOnelab(std::string sockName, std::string modelName) {
   ps[0].setValue(modelName);
   loader->set(ps[0]);
 }
-/*
+
 void AddOnelabNumberChoice(std::string name, double val, std::string help)
 {
   std::vector<double> choices;
diff --git a/utils/api_demos/mainGeoFactory.cpp b/utils/api_demos/mainGeoFactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fe518ed2519a92cf867ab771a06ea65fab5b5664
--- /dev/null
+++ b/utils/api_demos/mainGeoFactory.cpp
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include "Gmsh.h"
+#include "GModel.h"
+
+int main(int argc, char **argv)
+{
+  GmshInitialize(argc, argv);
+  GModel *m = new GModel();
+
+  GVertex *v1 = m->addVertex(0, 0, 0, 0.1);
+  GVertex *v2 = m->addVertex(1, 0, 0, 0.1);
+  GVertex *v3 = m->addVertex(1, 1, 0, 0.1);
+  GVertex *v4 = m->addVertex(0, 1, 0, 0.1);
+
+  std::vector<GEdge*> edges;
+  edges.push_back(m->addLine(v1, v2));
+  edges.push_back(m->addLine(v2, v3));
+  edges.push_back(m->addLine(v3, v4));
+  edges.push_back(m->addLine(v4, v1));
+
+  std::vector<std::vector<GEdge*> > loop;
+  loop.push_back(edges);
+  GFace *f = m->addPlanarFace(loop);
+
+  m->mesh(2);
+  m->writeMSH("test.msh");
+  delete m;
+  GmshFinalize();
+}