diff --git a/utils/api_demos/CMakeLists.txt b/utils/api_demos/CMakeLists.txt
index 021bf4c47576b940b19ac6d2aa2a2046fcb1caff..eab5b73d8b576786b4954945919c252080741c7f 100644
--- a/utils/api_demos/CMakeLists.txt
+++ b/utils/api_demos/CMakeLists.txt
@@ -53,6 +53,9 @@ target_link_libraries(mainPost shared)
 add_executable(mainSimple mainSimple.cpp)
 target_link_libraries(mainSimple shared)
 
+add_executable(mainReadMesh mainReadMesh.cpp)
+target_link_libraries(mainReadMesh shared)
+
 add_executable(mainGeoFactory mainGeoFactory.cpp)
 target_link_libraries(mainGeoFactory shared)
 
diff --git a/utils/api_demos/mainReadMesh.cpp b/utils/api_demos/mainReadMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d7c477a2a311951b8992fc5f0dc082814569db06
--- /dev/null
+++ b/utils/api_demos/mainReadMesh.cpp
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include "Gmsh.h"
+#include "GModel.h"
+#include "MTetrahedron.h"
+#include "MTriangle.h"
+
+int main(int argc, char **argv)
+{
+  GmshInitialize(argc, argv);
+  GModel *m = new GModel();
+  m->readMSH("../problem.msh");
+  for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); ++it){
+    GRegion *r = *it;
+    for(unsigned int i = 0; i < r->tetrahedra.size(); i++)
+      printf(" tet %d: vertices %d %d %d %d\n", r->tetrahedra[i]->getNum(),
+             r->tetrahedra[i]->getVertex(0)->getNum(),
+             r->tetrahedra[i]->getVertex(1)->getNum(),
+             r->tetrahedra[i]->getVertex(2)->getNum(),
+             r->tetrahedra[i]->getVertex(3)->getNum());
+  }
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it){
+    GFace *f = *it;
+    for(unsigned int i = 0; i < f->triangles.size(); i++)
+      printf(" tri %d: vertices %d %d %d\n", f->triangles[i]->getNum(),
+             f->triangles[i]->getVertex(0)->getNum(),
+             f->triangles[i]->getVertex(1)->getNum(),
+             f->triangles[i]->getVertex(2)->getNum());
+  }
+  delete m;
+  GmshFinalize();
+}