diff --git a/Makefile b/Makefile
index e316b5810a4b568cbfa78d9d9883c014eeb6cae2..2e970daf455dfda68cf5c8e375fa932017f1f310 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.372 2004-10-04 05:08:14 geuzaine Exp $
+# $Id: Makefile,v 1.373 2004-10-08 04:36:20 geuzaine Exp $
 #
 # Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 #
@@ -64,8 +64,10 @@ variables: configure
 parser:
 	cd Parser && ${MAKE} parser
 
-converters:
+.PHONY: utils
+utils:
 	cd utils/converters/autocad && ${MAKE}
+	cd utils/misc && ${MAKE}
 
 .PHONY: doc
 doc:
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index fc6dd611ea88f58446738e08ff0d594b5e9991ae..59df7d1367c319f310046a17be049cbf18517cea 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -1,5 +1,5 @@
 \input texinfo.tex @c -*-texinfo-*-
-@c $Id: gmsh.texi,v 1.134 2004-10-04 04:40:59 geuzaine Exp $
+@c $Id: gmsh.texi,v 1.135 2004-10-08 04:36:21 geuzaine Exp $
 @c
 @c Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 @c
@@ -2690,6 +2690,14 @@ All non-parsed file formats have sections enclosed between @code{$KEY} and
 @cindex File format, mesh
 @cindex @file{.msh} file
 
+Please note that the list of nodes and elements in Gmsh's mesh files do not
+have to be dense or ordered (i.e., the node and element numbers do not have
+to be given in a consecutive or even an ordered way). A sample C++ program
+to transform the formats so that all lists are dense and ordered is
+available in the source distribution (@file{utils/misc/mshsort.cpp}). This
+program is also a good example on how to read and write files in the
+@file{.msh} format.
+
 @menu
 * Version 1.0::                 
 * Version 2.0::                 
diff --git a/gmsh.spec b/gmsh.spec
index 72542f19b425fdd23ce6e989b0c069afec0e40ca..c56b6fc6bad980f681ffbef6df18895b5ed72ec7 100644
--- a/gmsh.spec
+++ b/gmsh.spec
@@ -32,7 +32,7 @@ and/or post-processor.
 
 %build
 make distrib-unix
-make converters
+make utils
 make doc-info
 strip bin/gmsh
 rm -rf CVS */CVS */*/CVS
@@ -45,6 +45,7 @@ mkdir -p $RPM_BUILD_ROOT/usr/share/info
 
 install -m 755 bin/gmsh $RPM_BUILD_ROOT/usr/bin/gmsh
 install -m 755 bin/dxf2geo $RPM_BUILD_ROOT/usr/bin/dxf2geo
+install -m 755 bin/mshsort $RPM_BUILD_ROOT/usr/bin/mshsort
 install -m 644 doc/gmsh.1 $RPM_BUILD_ROOT/usr/share/man/man1/gmsh.1
 install -m 644 doc/texinfo/gmsh.info* $RPM_BUILD_ROOT/usr/share/info/
 
@@ -59,5 +60,6 @@ rm -rf $RPM_BUILD_ROOT
 %doc doc/LICENSE doc/VERSIONS doc/FAQ doc/CREDITS demos tutorial
 /usr/bin/gmsh
 /usr/bin/dxf2geo
+/usr/bin/mshsort
 /usr/share/man/man1/gmsh*
 /usr/share/info/gmsh*
diff --git a/utils/misc/mshdensify.cpp b/utils/misc/mshsort.cpp
similarity index 96%
rename from utils/misc/mshdensify.cpp
rename to utils/misc/mshsort.cpp
index b6c971c360b7884e087c0daa96778ab927f700e5..9789a4f4bba4bc6a3a14f5d2117f02efdcffab90 100644
--- a/utils/misc/mshdensify.cpp
+++ b/utils/misc/mshsort.cpp
@@ -1,4 +1,4 @@
-// $Id: mshdensify.cpp,v 1.1 2004-10-08 02:41:56 geuzaine Exp $
+// $Id: mshsort.cpp,v 1.1 2004-10-08 04:36:21 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -135,10 +135,8 @@ double readMesh(char *fileName, map<int, node*> &nodes, vector<element*> &elemen
 	  fprintf(stderr, "Error: node %d already exists\n", num);
 	  exit(1);
 	}
-	else{
-	  node *n = new node(x, y, z);
-	  nodes[num] = n;
-	}
+	else
+	  nodes[num] = new node(x, y, z);
       }
     }
     else if(!strncmp(&str[1], "ELM", 3) ||
@@ -184,9 +182,8 @@ double readMesh(char *fileName, map<int, node*> &nodes, vector<element*> &elemen
         for(int j = 0; j < numNodes; j++){
 	  int numNode;
           fscanf(fp, "%d", &numNode);
-	  if(nodes.count(numNode)){
+	  if(nodes.count(numNode))
 	    e->addNode(nodes[numNode]);
-	  }
 	  else{
             fprintf(stderr, "Error: Unknown vertex %d in element %d\n", numNode,  num);
 	    exit(1);
@@ -256,7 +253,8 @@ void printMesh(double version, map<int, node*> nodes, vector<element*> elements)
 int main(int argc, char **argv)
 {
   if(argc != 2){
-    fprintf(stderr, "Usage: %s file\n", argv[0]);
+    fprintf(stderr, "mshsort, a utility to reorder the node and element lists in Gmsh MSH files\n");
+    fprintf(stderr, "Usage: %s file.msh\n", argv[0]);
     exit(1);
   }