diff --git a/utils/converters/matlab/load_gmsh.m b/utils/converters/matlab/load_gmsh.m
new file mode 100644
index 0000000000000000000000000000000000000000..b6df2927a8d4701e7e85a2c046eb804b14d6e63f
--- /dev/null
+++ b/utils/converters/matlab/load_gmsh.m
@@ -0,0 +1,88 @@
+function mesh = load_gmsh ( filename )
+% Reads a 2D mesh in msh format, version 1
+    mesh = [];    
+    mesh.MIN = zeros(3,1);
+    mesh.MAX = zeros(3,1);
+    fid = fopen ( filename, 'r');
+    while 1
+        endoffile = 0;
+        while 1
+            tline = fgetl(fid);
+            if feof(fid), endoffile=1,break, end
+            if tline(1) == '$'  break, end  
+        end
+        if endoffile == 1 , break, end
+            
+        if tline (2) == 'N' && tline(3) == 'O'
+            disp('reading nodes')
+            mesh.nbNod = fscanf (fid, '%d',1);
+	        mesh.POS = zeros (mesh.nbNod, 3);
+            for(I=1:mesh.nbNod)
+                iNod = fscanf(fid,'%d',1);
+                X = fscanf(fid,'%g',3);
+                IDS(iNod) = I;
+                if (I == 1)
+                    mesh.MIN = X;
+                    mesh.MAX = X;
+                else
+                    if (mesh.MAX(1) < X(1))mesh.MAX(1)=X(1);end
+                    if (mesh.MAX(2) < X(2))mesh.MAX(2)=X(2);end
+                    if (mesh.MAX(3) < X(3))mesh.MAX(3)=X(3);end
+                    if (mesh.MIN(1) > X(1))mesh.MIN(1)=X(1);end
+                    if (mesh.MIN(2) > X(2))mesh.MIN(2)=X(2);end
+                    if (mesh.MIN(3) > X(3))mesh.MIN(3)=X(3);end
+                    end
+                mesh.POS(I,1) = X(1);
+                mesh.POS(I,2) = X(2);
+                mesh.POS(I,3) = X(3);
+            end
+            tline = fgetl(fid);
+            disp('nodes have been read')
+
+        else if tline (2) == 'E' && tline(3) == 'L'
+            disp('reading elements')
+            mesh.nbElm = fscanf (fid, '%d',1);
+            mesh.ELE_INFOS = zeros (mesh.nbElm,5);
+            mesh.nbBeams = 0;
+            mesh.nbPoints = 0;
+            mesh.nbTriangles = 0;
+            mesh.nbQuads = 0;
+            mesh.POINTS=zeros(mesh.nbElm,2);
+            mesh.BEAMS=zeros(mesh.nbElm,3);
+            mesh.TRIANGLES=zeros(mesh.nbElm,4);
+            mesh.QUADS=zeros(mesh.nbElm,5);
+            for(I=1:mesh.nbElm)
+                mesh.ELE_INFOS(I,:) = fscanf (fid,'%d',5);
+                NODES_ELEM = fscanf (fid,'%d',mesh.ELE_INFOS(I,5));
+                if (mesh.ELE_INFOS(I,2) == 15) %% point
+                    mesh.nbPoints = mesh.nbPoints + 1;
+                    mesh.POINTS ( mesh.nbPoints,1 ) = IDS (NODES_ELEM ( 1) );
+                    mesh.POINTS ( mesh.nbPoints,2 ) = I;
+                end
+                if (mesh.ELE_INFOS(I,2) == 1) %% beam
+                    mesh.nbBeams = mesh.nbBeams + 1;
+                    mesh.BEAMS ( mesh.nbBeams,1 ) = IDS (NODES_ELEM ( 1) );
+                    mesh.BEAMS ( mesh.nbBeams,2 ) = IDS (NODES_ELEM ( 2) );   
+                    mesh.BEAMS ( mesh.nbBeams,3 ) = I;   
+                end
+                if (mesh.ELE_INFOS(I,2) == 2) %% triangle
+                   mesh.nbTriangles = mesh.nbTriangles + 1;
+                   mesh.TRIANGLES ( mesh.nbTriangles , 1) = IDS (NODES_ELEM ( 1) );
+                   mesh.TRIANGLES ( mesh.nbTriangles , 2) = IDS (NODES_ELEM ( 2) );
+                   mesh.TRIANGLES ( mesh.nbTriangles , 3) = IDS (NODES_ELEM ( 3) );
+                   mesh.TRIANGLES ( mesh.nbTriangles , 4) = I;
+                end
+                if (mesh.ELE_INFOS(I,2) == 4) %% quadrangle
+                   mesh.nbQuads = mesh.nbQuads + 1;
+                   mesh.QUADS ( mesh.nbQuads , 1) = IDS (NODES_ELEM ( 1) );
+                   mesh.QUADS ( mesh.nbQuads , 2) = IDS (NODES_ELEM ( 2) );
+                   mesh.QUADS ( mesh.nbQuads , 3) = IDS (NODES_ELEM ( 3) );
+                   mesh.QUADS ( mesh.nbQuads , 4) = IDS (NODES_ELEM ( 4) );
+                   mesh.QUADS ( mesh.nbQuads , 5) = I;
+                end
+            end
+            tline = fgetl(fid);
+            disp('elements have been read')
+        end
+    end
+fclose (fid);