diff --git a/Common/Views.h b/Common/Views.h
index 857fd2ff590de7d5a46a08c16124b80538ed89cf..da0c1a1dd503448fb00d75f1fe24ccaad08c7ff4 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -206,7 +206,6 @@ void CopyViewOptions(Post_View *src, Post_View *dest);
 void CombineViews(int time, int how, int remove);
 
 int BGMWithView (Post_View *ErrView);
-double ErrorInView(Post_View * ErrView, int *n);
 Post_View *Create2DGraph(char *xname, char *yname, int nbdata, double *x, double *y);
 
 GmshColorTable *Get_ColorTable(int num);
diff --git a/Mesh/3D_BGMesh.cpp b/Mesh/3D_BGMesh.cpp
index a641fe9a397da5d01be610f4a3135307b303740b..766ccf04baeffb7c5670fb623bc37c96c68552db 100644
--- a/Mesh/3D_BGMesh.cpp
+++ b/Mesh/3D_BGMesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_BGMesh.cpp,v 1.38 2006-01-06 00:34:25 geuzaine Exp $
+// $Id: 3D_BGMesh.cpp,v 1.39 2006-01-28 15:02:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -161,13 +161,56 @@ static void AIG(void *a, void *b)
   AddSimplexInGrid(TMPM, s, BOITE);
 }
 
+void BGMWithViewList(int Nb, List_T *List, Tree_T *Pts, int NbNod, Vertex *VertexUp)
+{
+  if(Nb) {
+    int nb = List_Nbr(List) / Nb;
+    for(int i = 0; i < List_Nbr(List); i += nb) {
+      double *X = (double *)List_Pointer_Fast(List, i);
+      double *Y = (double *)List_Pointer_Fast(List, i + NbNod);
+      double *Z = (double *)List_Pointer_Fast(List, i + 2 * NbNod);
+      double *Val = (double *)List_Pointer_Fast(List, i + 3 * NbNod);
+      Vertex *ver[4];
+      for(int j = 0; j < NbNod; j++) {
+	Vertex V;
+        Vertex *v = &V;
+        v->Pos.X = X[j];
+        v->Pos.Y = Y[j];
+        v->Pos.Z = Z[j];
+        if(Tree_Query(Pts, &v)) {
+          ver[j] = v;
+        }
+        else {
+          v = Create_Vertex(TMPM->MaxPointNum++, X[j], Y[j], Z[j], Val[j], -1.0);
+          ver[j] = v;
+          Tree_Add(TMPM->Vertices, &v);
+          Tree_Add(Pts, &v);
+        }
+      }
+      if(NbNod == 3){ // tri
+	Simplex *s = Create_Simplex(ver[0], ver[1], ver[2], VertexUp);
+	Tree_Add(TMPM->Simplexes, &s);
+      }
+      else{
+	if(VertexUp){ // quad
+	  Simplex *s1 = Create_Simplex(ver[0], ver[1], ver[2], VertexUp);
+	  Tree_Add(TMPM->Simplexes, &s1);
+	  Simplex *s2 = Create_Simplex(ver[0], ver[2], ver[3], VertexUp);
+	  Tree_Add(TMPM->Simplexes, &s2);
+	}
+	else{ // tet
+	  Simplex *s = Create_Simplex(ver[0], ver[1], ver[2], ver[3]);
+	  Tree_Add(TMPM->Simplexes, &s);
+	}
+      }
+    }
+  }
+}
+
 int BGMWithView(Post_View * ErrView)
 {
-  Vertex *VertexUp, *v, V, *ver[4];
+  Vertex *VertexUp;
   Tree_T *Pts;
-  int i, j, k, nb;
-  double *X, *Y, *Z, *Val;
-  Simplex *si;
 
   if(TMPM){
     Tree_Action(TMPM->Vertices, Free_Vertex);    
@@ -184,69 +227,17 @@ int BGMWithView(Post_View * ErrView)
   TMPM->BGM.Typ = ONFILE;
   TMPM->Vertices = Tree_Create(sizeof(Vertex *), compareVertex);
   TMPM->Simplexes = Tree_Create(sizeof(Simplex *), compareSimplex);
+  TMPM->MaxPointNum = 0;
   Create_BgMesh(ONFILE, .2, THEM);
 
-  k = 1;
-  if(ErrView->NbST) {
-    nb = List_Nbr(ErrView->ST) / ErrView->NbST;
-    for(i = 0; i < List_Nbr(ErrView->ST); i += nb) {
-      X = (double *)List_Pointer_Fast(ErrView->ST, i);
-      Y = (double *)List_Pointer_Fast(ErrView->ST, i + 3);
-      Z = (double *)List_Pointer_Fast(ErrView->ST, i + 6);
-      Val = (double *)List_Pointer_Fast(ErrView->ST, i + 9);
-
-      for(j = 0; j < 3; j++) {
-        v = &V;
-        v->Pos.X = X[j];
-        v->Pos.Y = Y[j];
-        v->Pos.Z = Z[j];
-        if(Tree_Query(Pts, &v)) {
-          ver[j] = v;
-        }
-        else {
-          v = Create_Vertex(k++, X[j], Y[j], Z[j], Val[j], -1.0);
-          ver[j] = v;
-          Tree_Add(TMPM->Vertices, &v);
-          Tree_Add(Pts, &v);
-        }
-      }
-      si = Create_Simplex(ver[0], ver[1], ver[2], VertexUp);
-      Tree_Add(TMPM->Simplexes, &si);
-    }
-  }
-
-  if(ErrView->NbSS) {
-    nb = List_Nbr(ErrView->SS) / ErrView->NbSS;
-    for(i = 0; i < List_Nbr(ErrView->SS); i += nb) {
-      X = (double *)List_Pointer_Fast(ErrView->SS, i);
-      Y = (double *)List_Pointer_Fast(ErrView->SS, i + 4);
-      Z = (double *)List_Pointer_Fast(ErrView->SS, i + 8);
-      Val = (double *)List_Pointer_Fast(ErrView->SS, i + 12);
-
-      for(j = 0; j < 4; j++) {
-        v = &V;
-        v->Pos.X = X[j];
-        v->Pos.Y = Y[j];
-        v->Pos.Z = Z[j];
-        if(Tree_Query(Pts, &v)) {
-          ver[j] = v;
-        }
-        else {
-          v = Create_Vertex(k++, X[j], Y[j], Z[j], Val[j], -1.0);
-          ver[j] = v;
-          Tree_Add(TMPM->Vertices, &v);
-          Tree_Add(Pts, &v);
-        }
-      }
-      si = Create_Simplex(ver[0], ver[1], ver[2], ver[3]);
-      Tree_Add(TMPM->Simplexes, &si);
-    }
-  }
+  BGMWithViewList(ErrView->NbST, ErrView->ST, Pts, 3, VertexUp);
+  BGMWithViewList(ErrView->NbSQ, ErrView->SQ, Pts, 4, VertexUp);
+  BGMWithViewList(ErrView->NbSS, ErrView->SS, Pts, 4, NULL);
 
   TMPM->Grid.init = 0;
-  TMPM->Grid.Nx = 10;
-  TMPM->Grid.Ny = 10;
-  TMPM->Grid.Nz = 10;
+  TMPM->Grid.Nx = 20;
+  TMPM->Grid.Ny = 20;
+  TMPM->Grid.Nz = 20;
   Tree_Action(TMPM->Vertices, findminmax);
   getminmax(&TMPM->Grid.min.X, &TMPM->Grid.min.Y, &TMPM->Grid.min.Z,
             &TMPM->Grid.max.X, &TMPM->Grid.max.Y, &TMPM->Grid.max.Z);
@@ -268,39 +259,3 @@ int BGMWithView(Post_View * ErrView)
 
   return 1;
 }
-
-
-double ErrorInView(Post_View * ErrView, int *n)
-{
-  double e, tot = 0.0, *Val;
-  int i, j = 0, nb;
-
-  if(ErrView == NULL) {
-    Msg(WARNING, "Empty error view");
-    return 0.;
-  }
-
-  if(ErrView->NbST) {
-    nb = List_Nbr(ErrView->ST) / ErrView->NbST;
-    for(i = 0; i < List_Nbr(ErrView->ST); i += nb) {
-      Val = (double *)List_Pointer_Fast(ErrView->ST, i + 9);
-      e = (Val[0] + Val[1] + Val[2]) / 3.;
-      tot += e * e;
-      j++;
-    }
-  }
-
-  if(ErrView->NbSS) {
-    nb = List_Nbr(ErrView->SS) / ErrView->NbSS;
-    for(i = 0; i < List_Nbr(ErrView->SS); i += nb) {
-      Val = (double *)List_Pointer_Fast(ErrView->SS, i + 12);
-      e = (Val[0] + Val[1] + Val[2] + Val[3]) * 0.25;
-      tot += e * e;
-      j++;
-    }
-  }
-
-  *n = j;
-
-  return 100 * sqrt(tot);
-}