diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index d79056ab6ca53eb67ed93f61086b9bbe2c22199c..14ec4e982808a45150604a57002e5cd29588be1d 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: GModelIO_Mesh.cpp,v 1.18 2007-05-13 10:37:02 geuzaine Exp $
+// $Id: GModelIO_Mesh.cpp,v 1.19 2007-05-14 12:51:09 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -1365,14 +1365,14 @@ int GModel::writeUNV(const std::string &name, bool saveAll, bool saveGroupsOfNod
   }
   fprintf(fp, "%6d\n", -1);
 
-  // groups of nodes (for physical lines and physical surfaces)
+  // groups of nodes for physical groups
   if(saveGroupsOfNodes){
     fprintf(fp, "%6d\n", -1);
     fprintf(fp, "%6d\n", 2477);
     std::map<int, std::vector<GEntity*> > groups[4];
     getPhysicalGroups(groups);
     int gr = 1;
-    for(int dim = 1; dim <= 2; dim++){
+    for(int dim = 1; dim <= 3; dim++){
       for(std::map<int, std::vector<GEntity*> >::iterator it = groups[dim].begin();
 	  it != groups[dim].end(); it++){
 	std::set<MVertex*> nodes;
@@ -1392,10 +1392,24 @@ int GModel::writeUNV(const std::string &name, bool saveAll, bool saveGroupsOfNod
 	      for(int k = 0; k < gf->quadrangles[j]->getNumVertices(); k++)
 		nodes.insert(gf->quadrangles[j]->getVertex(k));
 	  }
+	  else if(dim == 3){
+	    GRegion *gr = (GRegion*)it->second[i];
+	    for(unsigned int j = 0; j < gr->tetrahedra.size(); j++)
+	      for(int k = 0; k < gr->tetrahedra[j]->getNumVertices(); k++)
+		nodes.insert(gr->tetrahedra[j]->getVertex(k));
+	    for(unsigned int j = 0; j < gr->hexahedra.size(); j++)
+	      for(int k = 0; k < gr->hexahedra[j]->getNumVertices(); k++)
+		nodes.insert(gr->hexahedra[j]->getVertex(k));
+	    for(unsigned int j = 0; j < gr->prisms.size(); j++)
+	      for(int k = 0; k < gr->prisms[j]->getNumVertices(); k++)
+		nodes.insert(gr->prisms[j]->getVertex(k));
+	    for(unsigned int j = 0; j < gr->pyramids.size(); j++)
+	      for(int k = 0; k < gr->pyramids[j]->getNumVertices(); k++)
+		nodes.insert(gr->pyramids[j]->getVertex(k));
+	  }
 	}
-	fprintf(fp, "%10d%10d%10d%10d%10d%10d%10d%10d\n",
-		gr++, 0, 0, 0, 0, 0, 0, nodes.size());
-	fprintf(fp, "PERMANENT GROUP1\n");
+	fprintf(fp, "%10d%10d%10d%10d%10d%10d%10d%10d\n", gr, 0, 0, 0, 0, 0, 0, nodes.size());
+	fprintf(fp, "PERMENENT GROUP%d\n", gr++);
 	int row = 0;
 	for(std::set<MVertex*>::iterator it2 = nodes.begin(); it2 != nodes.end(); it2++){
 	  if(row == 2) {