diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
index bd7f9b6a65dbb9253d7b90f29b6d43758e7f6ba1..c17f47a6f945342d242a47a851a02b363365fc95 100644
--- a/Geo/CAD.cpp
+++ b/Geo/CAD.cpp
@@ -1,4 +1,4 @@
-// $Id: CAD.cpp,v 1.17 2001-02-23 00:07:51 remacle Exp $
+// $Id: CAD.cpp,v 1.18 2001-04-07 07:20:22 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Geo.h"
@@ -1062,8 +1062,10 @@ void Extrude_ProtudeSurface(int ep, int is,
     List_Read(ps->s.Generatrices,i,&c2);
     List_Read(chapeau->s.Generatrices,i,&c);
     if(c->Num<0)
-      if(!(c = FindCurve(-c->Num,THEM)))
-         Msg(FATAL, "Unknown Curve %d", -c->Num);
+      if(!(c = FindCurve(-c->Num,THEM))){
+         Msg(GERROR, "Unknown Curve %d", -c->Num);
+	 return;
+      }
     c->Extrude = new ExtrudeParams(COPIED_ENTITY);
     c->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
     c->Extrude->geo.Source = abs(c2->Num);
@@ -1318,14 +1320,20 @@ void ReplaceAllDuplicates ( Mesh *m ){
     if(c->Num > 0){
       if(!Tree_Search(allNonDulpicatedCurves,&c)){
         Tree_Insert(allNonDulpicatedCurves,&c);
-        if(!(c2 = FindCurve(-c->Num,m)))
-          Msg(FATAL, "Unknown Curve %d", -c->Num);
+        if(!(c2 = FindCurve(-c->Num,m))){
+          Msg(GERROR, "Unknown Curve %d", -c->Num);
+	  List_Delete(All);
+	  return;
+	}
         Tree_Insert(allNonDulpicatedCurves,&c2);
       }
       else{
         Tree_Suppress(m->Curves,&c);
-        if(!(c2 = FindCurve(-c->Num,m)))
-          Msg(FATAL, "Unknown Curve %d", -c->Num);
+        if(!(c2 = FindCurve(-c->Num,m))){
+          Msg(GERROR, "Unknown Curve %d", -c->Num);
+	  List_Delete(All);
+	  return;
+	}
         Tree_Suppress(m->Curves,&c2);
       }
     }
@@ -1495,8 +1503,10 @@ void CopyShape(int Type, int Num, int *New){
 
   switch(Type){
   case MSH_POINT:
-    if(!(v = FindPoint(Num,THEM)))
-      Msg(FATAL, "Unknown Vertex %d", Num);
+    if(!(v = FindPoint(Num,THEM))){
+      Msg(GERROR, "Unknown Vertex %d", Num);
+      return;
+    }
     newv = DuplicateVertex(v);
     *New = newv->Num;
     break;
@@ -1505,8 +1515,10 @@ void CopyShape(int Type, int Num, int *New){
   case MSH_SEGM_CIRC:
   case MSH_SEGM_ELLI:
   case MSH_SEGM_NURBS:
-    if(!(c = FindCurve(Num,THEM)))
-      Msg(FATAL, "Unknown Curve %d", Num);
+    if(!(c = FindCurve(Num,THEM))){
+      Msg(GERROR, "Unknown Curve %d", Num);
+      return;
+    }
     newc = DuplicateCurve(c);
     *New = newc->Num;
     break;
@@ -1514,8 +1526,10 @@ void CopyShape(int Type, int Num, int *New){
   case MSH_SURF_TRIC:
   case MSH_SURF_REGL:
   case MSH_SURF_PLAN:
-    if(!(s = FindSurface(Num,THEM)))
-      Msg(FATAL, "Unknown Surface %d", Num);
+    if(!(s = FindSurface(Num,THEM))){
+      Msg(GERROR, "Unknown Surface %d", Num);
+      return;
+    }
     news = DuplicateSurface(s,1);
     *New = news->Num;
     break;
diff --git a/Geo/DataBase.cpp b/Geo/DataBase.cpp
index faba62b26627fff66bede4c88d336b8816c003c2..65da00be9c519703286b9917eb575b481ca34321 100644
--- a/Geo/DataBase.cpp
+++ b/Geo/DataBase.cpp
@@ -1,4 +1,4 @@
-// $Id: DataBase.cpp,v 1.9 2001-03-23 14:41:52 geuzaine Exp $
+// $Id: DataBase.cpp,v 1.10 2001-04-07 07:20:22 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -121,13 +121,21 @@ void AddQuadricSurfaceInDataBase (int Typ, int NumQuadric, double zaxis[3],
   s->s.Generatrices = List_Create(4, 1, sizeof(Curve*));
   for(i=0;i<NbLoop;i++){
     List_Read(loops,i,&iLoop);
-    if(!(el = FindEdgeLoop(iLoop,THEM)))
-      Msg(FATAL, "Unknown Loop %d", iLoop);
+    if(!(el = FindEdgeLoop(iLoop,THEM))){
+      Msg(GERROR, "Unknown Loop %d", iLoop);
+      List_Delete(s->s.Generatrices);
+      Free(s);
+      return;
+    }
     else{
       for(j=0;j<List_Nbr(el->Curves);j++){
         List_Read(el->Curves,j,&ic);
-        if(!(c = FindCurve(ic,THEM)))
-          Msg(FATAL, "Unknown Curve %d", ic);
+        if(!(c = FindCurve(ic,THEM))){
+          Msg(GERROR, "Unknown Curve %d", ic);
+	  List_Delete(s->s.Generatrices);
+	  Free(s);
+	  return;
+	}
         else
           List_Add (s->s.Generatrices, &c);
       }
@@ -155,13 +163,21 @@ void CreateSurfaceFromOldCrappyDatabase (int izon, int typzon, int o1, int o2,
   s->s.Generatrices = List_Create(4, 1, sizeof(Curve*));
   for(i=0;i<NbLoop;i++){
     List_Read(loops,i,&iLoop);
-    if(!(el = FindEdgeLoop(iLoop,THEM)))
-      Msg(FATAL, "Unknown Line Loop %d", iLoop);
+    if(!(el = FindEdgeLoop(iLoop,THEM))){
+      Msg(GERROR, "Unknown Line Loop %d", iLoop);
+      List_Delete(s->s.Generatrices);
+      Free(s);
+      return;
+    }	  
     else{
       for(j=0;j<List_Nbr(el->Curves);j++){
         List_Read(el->Curves,j,&ic);
-        if(!(c = FindCurve(ic,THEM)))
-          Msg(FATAL, "Unknown Curve %d", ic);
+        if(!(c = FindCurve(ic,THEM))){
+          Msg(GERROR, "Unknown Curve %d", ic);
+	  List_Delete(s->s.Generatrices);
+	  Free(s);
+	  return;
+	}
         else
           List_Add (s->s.Generatrices, &c);
       }
@@ -203,13 +219,21 @@ void CreateVolumeFromOldCrappyDatabase (int izon, List_T *loops, Mesh *M){
   v->Surfaces = List_Create(4, 1, sizeof(Surface*));
   for(i=0;i<List_Nbr(loops);i++){
     List_Read(loops,i,&iLoop);
-    if(!(sl = FindSurfaceLoop(iLoop,THEM)))
-      Msg(FATAL, "Unknown Surface Loop %d", iLoop);
+    if(!(sl = FindSurfaceLoop(iLoop,THEM))){
+      Msg(GERROR, "Unknown Surface Loop %d", iLoop);
+      List_Delete(v->Surfaces);
+      Free(v);
+      return;
+    }
     else{
       for(j=0;j<List_Nbr(sl->Surfaces);j++){
         List_Read(sl->Surfaces,j,&is);
-        if(!(s = FindSurface(abs(is),THEM)))
-          Msg(FATAL, "Unknown Surface %d", is);
+        if(!(s = FindSurface(abs(is),THEM))){
+          Msg(GERROR, "Unknown Surface %d", is);
+	  List_Delete(v->Surfaces);
+	  Free(v);
+	  return;
+	}
         else
           List_Add (v->Surfaces, &s);
       }
@@ -317,8 +341,10 @@ void CreateNurbsSurfaceSupport (int Num , int Order1, int Order2 ,
   Nv = List_Nbr(ListOfDouble_L);
   Cdbz101(Num,MSH_SURF_NURBS,Order1,Order2,Nv,Nu,0,ListCP,NULL,NULL);
 
-  if(!(s = FindSurface(Num,THEM)))
-    Msg(FATAL, "Unknown Surface Loop %d", Num);
+  if(!(s = FindSurface(Num,THEM))){
+    Msg(GERROR, "Unknown Surface Loop %d", Num);
+    return;
+  }
   else{
     s->ku = (float*)malloc(List_Nbr(ku)*sizeof(float));
     s->kv = (float*)malloc(List_Nbr(kv)*sizeof(float));
@@ -389,8 +415,12 @@ void CreateNurbsSurface (int Num , int Order1 , int Order2 , List_T *List,
   else{
     Loop[0] = NEWREG();
     Cdbseg101(Loop[0],TypLine,Order1,ListOfDouble_L,NULL,-1,-1,kumin,kumax,NULL,NULL,NULL);
-    if(!(cc = FindCurve(Loop[0],THEM)))
-      Msg(FATAL, "Unknown Curve %d", Loop[0]);
+    if(!(cc = FindCurve(Loop[0],THEM))){
+      Msg(GERROR, "Unknown Curve %d", Loop[0]);
+      List_Delete(Listint);
+      List_Delete(ListCP);
+      return;
+    }
     else{
       cc->k = (float*)malloc(4*List_Nbr(ku)*sizeof(float));
       for(i=0;i<List_Nbr(ku);i++){
@@ -412,8 +442,12 @@ void CreateNurbsSurface (int Num , int Order1 , int Order2 , List_T *List,
   else{
     Loop[2] = NEWREG();
     Cdbseg101(Loop[2],TypLine,Order1,ListOfDouble_L,NULL,-1,-1,kumin,kumax,NULL,NULL,NULL);
-    if(!(cc = FindCurve(Loop[2],THEM)))
-      Msg(FATAL, "Unknown Curve %d", Loop[2]);
+    if(!(cc = FindCurve(Loop[2],THEM))){
+      Msg(GERROR, "Unknown Curve %d", Loop[2]);
+      List_Delete(Listint);
+      List_Delete(ListCP);
+      return;
+    }
     else{
       cc->k = (float*)malloc(4*List_Nbr(ku)*sizeof(float));
       for(i=0;i<List_Nbr(ku);i++){
@@ -443,8 +477,14 @@ void CreateNurbsSurface (int Num , int Order1 , int Order2 , List_T *List,
   else{
     Loop[1] = NEWREG();
     Cdbseg101(Loop[1],TypLine,Order2,List1,NULL,-1,-1,kvmin,kvmax,NULL,NULL,NULL);
-    if(!(cc = FindCurve(Loop[1],THEM)))
-      Msg(FATAL, "Unknown Curve %d", Loop[1]);
+    if(!(cc = FindCurve(Loop[1],THEM))){
+      Msg(GERROR, "Unknown Curve %d", Loop[1]);
+      List_Delete(List1);
+      List_Delete(List2);
+      List_Delete(Listint);
+      List_Delete(ListCP);
+      return;
+    }
     else{
       cc->k = (float*)malloc(4*List_Nbr(kv) * sizeof(float));
       for(i=0;i<List_Nbr(kv);i++){
@@ -466,7 +506,7 @@ void CreateNurbsSurface (int Num , int Order1 , int Order2 , List_T *List,
     Loop[3] = NEWREG();
     Cdbseg101(Loop[3],TypLine,Order2,List2,NULL,-1,-1,kvmin,kvmax,NULL,NULL,NULL);
     if(!(cc = FindCurve(Loop[3],THEM)))
-      Msg(FATAL, "Unknown Curve %d", Loop[3]);
+      Msg(GERROR, "Unknown Curve %d", Loop[3]);
     else{
       cc->k = (float*)malloc(4*List_Nbr(kv)*sizeof(float));
       for(i=0;i<List_Nbr(kv);i++){
diff --git a/Graphics/PostSimplex.cpp b/Graphics/PostSimplex.cpp
index bd4f3770558cd90f7ddf387a21b060725c083d65..4b411261d5f88b2d68fded8ed2380aff33d428f2 100644
--- a/Graphics/PostSimplex.cpp
+++ b/Graphics/PostSimplex.cpp
@@ -1,4 +1,4 @@
-// $Id: PostSimplex.cpp,v 1.14 2001-04-06 10:26:36 geuzaine Exp $
+// $Id: PostSimplex.cpp,v 1.15 2001-04-07 07:20:22 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -27,7 +27,7 @@ void Draw_ScalarPoint(Post_View *View,
     Palette2(View,ValMin,ValMax,d);
     if(View->IntervalsType == DRAW_POST_NUMERIC){
       glRasterPos3d(X[0],Y[0],Z[0]);
-      sprintf(Num, "%g", d);
+      sprintf(Num, View->Format, d);
       Draw_String(Num);
     }
     else
@@ -108,7 +108,7 @@ void Draw_ScalarLine(Post_View *View,
     if(d >= ValMin && d <= ValMax){
       RaiseFill(0, d, ValMin, Raise);
       Palette2(View,ValMin,ValMax,d);
-      sprintf(Num, "%g", d);
+      sprintf(Num, View->Format, d);
       glRasterPos3d((X[0] + X[1])/2.,
 		    (Y[0] + Y[1])/2.,
 		    (Z[0] + Z[1])/2.);
@@ -242,7 +242,7 @@ void Draw_ScalarTriangle(Post_View *View,
     if(d >= ValMin && d <= ValMax){
       RaiseFill(0, d, ValMin, Raise);
       Palette2(View,ValMin,ValMax,d);
-      sprintf(Num, "%g", d);
+      sprintf(Num, View->Format, d);
       glRasterPos3d((X[0] + X[1] + X[2])/3.+Raise[0][0],
 		    (Y[0] + Y[1] + Y[2])/3.+Raise[1][0],
 		    (Z[0] + Z[1] + Z[2])/3.+Raise[2][0]);
@@ -445,13 +445,34 @@ void Draw_ScalarTetrahedron(Post_View *View,
 			    double *V){
 
   int     k;
+  double  d;
+  char Num[100];
+
+  if(!preproNormals && View->IntervalsType == DRAW_POST_NUMERIC){
+
+    d = (V[4*View->TimeStep]  +V[4*View->TimeStep+1]+
+	 V[4*View->TimeStep+2]+V[4*View->TimeStep+4]) / 4.;
+    if(d >= ValMin && d <= ValMax){
+      RaiseFill(0, d, ValMin, Raise);
+      Palette2(View,ValMin,ValMax,d);
+      sprintf(Num, View->Format, d);
+      glRasterPos3d((X[0] + X[1] + X[2] + X[3])/4.+Raise[0][0],
+		    (Y[0] + Y[1] + Y[2] + Y[3])/4.+Raise[1][0],
+		    (Z[0] + Z[1] + Z[2] + Z[3])/4.+Raise[2][0]);
+      Draw_String(Num);
+    }
+
+  }
+  else{
+
+    for(k=0 ; k<View->NbIso ; k++){
+      if(!preproNormals)Palette(View,View->NbIso,k);
+      IsoSimplex(View,preproNormals,
+		 X, Y, Z, &V[4*View->TimeStep],
+		 View->GVFI(ValMin,ValMax,View->NbIso,k), 
+		 ValMin, ValMax, View->Offset, Raise, View->Light);
+    }
 
-  for(k=0 ; k<View->NbIso ; k++){
-    if(!preproNormals)Palette(View,View->NbIso,k);
-    IsoSimplex(View,preproNormals,
-	       X, Y, Z, &V[4*View->TimeStep],
-	       View->GVFI(ValMin,ValMax,View->NbIso,k), 
-	       ValMin, ValMax, View->Offset, Raise, View->Light);
   }
 
 }
diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
index fa112c809c2d1b85dbda6fe68f049283f3f2aa13..345e1256e76965d031aa3b988c07ea5dd638606a 100644
--- a/Mesh/Create.cpp
+++ b/Mesh/Create.cpp
@@ -1,4 +1,4 @@
-// $Id: Create.cpp,v 1.10 2001-02-23 00:07:51 remacle Exp $
+// $Id: Create.cpp,v 1.11 2001-04-07 07:20:22 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -474,7 +474,7 @@ Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste,
       if ((v = FindPoint (iPnt, THEM)))
         List_Add (pC->Control_Points, &v);
       else
-        Msg(FATAL, "Unknown Control Point %d in Curve %d", iPnt, pC->Num);
+        Msg(GERROR, "Unknown Control Point %d in Curve %d", iPnt, pC->Num);
     }
   }
   else {