diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 0db6c7a85751e100dcfcc03ffe5259137c826e14..351ed904fa8a7bf46667719be9784c40b07c8567 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1062,7 +1062,7 @@ StringXNumber PostProcessingOptions_Number[] = {
     "Remove original views after a Combine operation" },
 
   { F|O, "Format" , opt_post_file_format , 0. ,
-    "Default file format for post-processing views (0=ASCII view, 1=binary view, 2=parsed view, 3=STL triangulation, 4=text)" },
+    "Default file format for post-processing views (0=ASCII view, 1=binary view, 2=parsed view, 3=STL triangulation, 4=text, 5=mesh)" },
 
   { F|O, "HorizontalScales" , opt_post_horizontal_scales , 1. , 
     "Display value scales horizontally" },
diff --git a/Common/Makefile b/Common/Makefile
index 3debdb36ecb541a0697c890e2fe567e24ae57a7c..33cd2af58449ff036fdf9af949a7d41da87c4784 100644
--- a/Common/Makefile
+++ b/Common/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.80 2006-01-14 16:24:53 geuzaine Exp $
+# $Id: Makefile,v 1.81 2006-01-27 21:15:30 geuzaine Exp $
 #
 # Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 #
@@ -29,7 +29,7 @@ CFLAGS  = ${OPTIM} ${FLAGS} ${INCLUDE}
 
 SRC = Context.cpp\
       AdaptiveViews.cpp\
-      Views.cpp\
+      Views.cpp ViewsIO.cpp\
       Options.cpp\
       CommandLine.cpp\
       Timer.cpp\
diff --git a/Common/Views.cpp b/Common/Views.cpp
index 031084f5be27d98593cf8c950e14abdf6f49e7b8..1aa656a213423f2edf3773115987c4f3ce609494 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.182 2006-01-17 17:09:05 geuzaine Exp $
+// $Id: Views.cpp,v 1.183 2006-01-27 21:15:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -784,640 +784,6 @@ Post_View *Create2DGraph(char *xname, char *yname,
   return v;
 }
 
-// Input/output
-
-void ReadView(FILE *file, char *filename)
-{
-  char str[256], name[256];
-  int i, nb, format, size, testone, swap, t2l, t3l;
-  double version;
-  Post_View *v;
-
-  Msg(INFO, "Reading post-processing file '%s'", filename);
-
-  while(1) {
-
-    do {
-      if(!fgets(str, 256, file))
-	break;
-      if(feof(file))
-        break;
-    } while(str[0] != '$');
-
-    if(feof(file))
-      break;
-
-    /*  F o r m a t  */
-
-    if(!strncmp(&str[1], "PostFormat", 10)) {
-      if(!fscanf(file, "%lf %d %d\n", &version, &format, &size)){
-        Msg(GERROR, "Read error");
-        return;
-      }
-      if(version < 1.0) {
-        Msg(GERROR, "This post-processing file is too old (version %g < 1.0)",
-            version);
-        return;
-      }
-      if(size == sizeof(double))
-        Msg(DEBUG, "Data is in double precision format (size==%d)", size);
-      else if(size == sizeof(float))
-        Msg(DEBUG, "Data is in single precision format (size==%d)", size);
-      else {
-        Msg(GERROR, "Unknown data size (%d) in post-processing file", size);
-        return;
-      }
-      if(format == 0)
-        format = LIST_FORMAT_ASCII;
-      else if(format == 1)
-        format = LIST_FORMAT_BINARY;
-      else {
-        Msg(GERROR, "Unknown format for view");
-        return;
-      }
-    }
-
-    /*  V i e w  */
-
-    if(!strncmp(&str[1], "View", 4)) {
-
-      v = BeginView(0);
-
-      if(version <= 1.0) {
-        Msg(DEBUG, "Detected post-processing view format <= 1.0");
-        if(!fscanf(file, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
-		   name, &v->NbTimeStep,
-		   &v->NbSP, &v->NbVP, &v->NbTP,
-		   &v->NbSL, &v->NbVL, &v->NbTL,
-		   &v->NbST, &v->NbVT, &v->NbTT, &v->NbSS, &v->NbVS, &v->NbTS)){
-	  Msg(GERROR, "Read error");
-	  return;
-	}
-        v->NbT2 = t2l = v->NbT3 = t3l = 0;
-      }
-      else if(version == 1.1) {
-        Msg(DEBUG, "Detected post-processing view format 1.1");
-        if(!fscanf(file,
-		   "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
-		   name, &v->NbTimeStep, &v->NbSP, &v->NbVP, &v->NbTP, &v->NbSL,
-		   &v->NbVL, &v->NbTL, &v->NbST, &v->NbVT, &v->NbTT, &v->NbSS,
-		   &v->NbVS, &v->NbTS, &v->NbT2, &t2l, &v->NbT3, &t3l)){
-	  Msg(GERROR, "Read error");
-	  return;
-	}
-      }
-      else if(version == 1.2 || version == 1.3) {
-        Msg(DEBUG, "Detected post-processing view format %g", version);
-        if(!fscanf(file, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
-		   "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
-		   name, &v->NbTimeStep,
-		   &v->NbSP, &v->NbVP, &v->NbTP,
-		   &v->NbSL, &v->NbVL, &v->NbTL,
-		   &v->NbST, &v->NbVT, &v->NbTT,
-		   &v->NbSQ, &v->NbVQ, &v->NbTQ,
-		   &v->NbSS, &v->NbVS, &v->NbTS,
-		   &v->NbSH, &v->NbVH, &v->NbTH,
-		   &v->NbSI, &v->NbVI, &v->NbTI,
-		   &v->NbSY, &v->NbVY, &v->NbTY,
-		   &v->NbT2, &t2l, &v->NbT3, &t3l)){
-	  Msg(GERROR, "Read error");
-	  return;
-	}
-      }
-      else if(version == 1.4) {
-        Msg(DEBUG, "Detected post-processing view format 1.4");
-        if(!fscanf(file, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
-		   "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
-		   "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
-		   name, &v->NbTimeStep,
-		   &v->NbSP, &v->NbVP, &v->NbTP,
-		   &v->NbSL, &v->NbVL, &v->NbTL,
-		   &v->NbST, &v->NbVT, &v->NbTT,
-		   &v->NbSQ, &v->NbVQ, &v->NbTQ,
-		   &v->NbSS, &v->NbVS, &v->NbTS,
-		   &v->NbSH, &v->NbVH, &v->NbTH,
-		   &v->NbSI, &v->NbVI, &v->NbTI,
-		   &v->NbSY, &v->NbVY, &v->NbTY,
-		   &v->NbSL2, &v->NbVL2, &v->NbTL2,
-		   &v->NbST2, &v->NbVT2, &v->NbTT2,
-		   &v->NbSQ2, &v->NbVQ2, &v->NbTQ2,
-		   &v->NbSS2, &v->NbVS2, &v->NbTS2,
-		   &v->NbSH2, &v->NbVH2, &v->NbTH2,
-		   &v->NbSI2, &v->NbVI2, &v->NbTI2,
-		   &v->NbSY2, &v->NbVY2, &v->NbTY2,
-		   &v->NbT2, &t2l, &v->NbT3, &t3l)){
-	  Msg(GERROR, "Read error");
-	  return;
-	}
-      }
-      else {
-        Msg(GERROR, "Unknown post-processing file format (version %g)",
-            version);
-        return;
-      }
-
-      for(i = 0; i < (int)strlen(name); i++)
-        if(name[i] == '^')
-          name[i] = ' ';
-
-      swap = 0;
-      if(format == LIST_FORMAT_BINARY) {
-        if(!fread(&testone, sizeof(int), 1, file)){
-	  Msg(GERROR, "Read error");
-	  return;
-	}
-        if(testone != 1) {
-          Msg(INFO, "Swapping bytes from binary file");
-          swap = 1;
-        }
-      }
-
-      v->DataSize = size;
-
-      // Time values
-      v->Time = List_CreateFromFile(v->NbTimeStep, 100, size, file, format, swap);
-
-      // Note: if nb==0, we still allocates the lists (so that they
-      // are ready to be filled later, e.g. in plugins)
-
-#define LCD List_CreateFromFile(nb, 1000, size, file, format, swap)
-
-      // Points
-      nb = v->NbSP ? v->NbSP * (v->NbTimeStep * 1 + 3) : 0; v->SP = LCD;
-      nb = v->NbVP ? v->NbVP * (v->NbTimeStep * 3 + 3) : 0; v->VP = LCD;
-      nb = v->NbTP ? v->NbTP * (v->NbTimeStep * 9 + 3) : 0; v->TP = LCD;
-
-      // Lines
-      nb = v->NbSL ? v->NbSL * (v->NbTimeStep * 2 * 1 + 6) : 0; v->SL = LCD;
-      nb = v->NbVL ? v->NbVL * (v->NbTimeStep * 2 * 3 + 6) : 0; v->VL = LCD;
-      nb = v->NbTL ? v->NbTL * (v->NbTimeStep * 2 * 9 + 6) : 0; v->TL = LCD;
-
-      // Triangles
-      nb = v->NbST ? v->NbST * (v->NbTimeStep * 3 * 1 + 9) : 0; v->ST = LCD;
-      nb = v->NbVT ? v->NbVT * (v->NbTimeStep * 3 * 3 + 9) : 0; v->VT = LCD;
-      nb = v->NbTT ? v->NbTT * (v->NbTimeStep * 3 * 9 + 9) : 0; v->TT = LCD;
-
-      // Quadrangles
-      nb = v->NbSQ ? v->NbSQ * (v->NbTimeStep * 4 * 1 + 12) : 0; v->SQ = LCD;
-      nb = v->NbVQ ? v->NbVQ * (v->NbTimeStep * 4 * 3 + 12) : 0; v->VQ = LCD;
-      nb = v->NbTQ ? v->NbTQ * (v->NbTimeStep * 4 * 9 + 12) : 0; v->TQ = LCD;
-
-      // Tetrahedra
-      nb = v->NbSS ? v->NbSS * (v->NbTimeStep * 4 * 1 + 12) : 0; v->SS = LCD;
-      nb = v->NbVS ? v->NbVS * (v->NbTimeStep * 4 * 3 + 12) : 0; v->VS = LCD;
-      nb = v->NbTS ? v->NbTS * (v->NbTimeStep * 4 * 9 + 12) : 0; v->TS = LCD;
-
-      // Hexahedra
-      nb = v->NbSH ? v->NbSH * (v->NbTimeStep * 8 * 1 + 24) : 0; v->SH = LCD;
-      nb = v->NbVH ? v->NbVH * (v->NbTimeStep * 8 * 3 + 24) : 0; v->VH = LCD;
-      nb = v->NbTH ? v->NbTH * (v->NbTimeStep * 8 * 9 + 24) : 0; v->TH = LCD;
-
-      // Prisms
-      nb = v->NbSI ? v->NbSI * (v->NbTimeStep * 6 * 1 + 18) : 0; v->SI = LCD;
-      nb = v->NbVI ? v->NbVI * (v->NbTimeStep * 6 * 3 + 18) : 0; v->VI = LCD;
-      nb = v->NbTI ? v->NbTI * (v->NbTimeStep * 6 * 9 + 18) : 0; v->TI = LCD;
-
-      // Pyramids
-      nb = v->NbSY ? v->NbSY * (v->NbTimeStep * 5 * 1 + 15) : 0; v->SY = LCD;
-      nb = v->NbVY ? v->NbVY * (v->NbTimeStep * 5 * 3 + 15) : 0; v->VY = LCD;
-      nb = v->NbTY ? v->NbTY * (v->NbTimeStep * 5 * 9 + 15) : 0; v->TY = LCD;
-
-      // 2nd order Lines
-      nb = v->NbSL2 ? v->NbSL2 * (v->NbTimeStep * 3 * 1 + 9) : 0; v->SL2 = LCD;
-      nb = v->NbVL2 ? v->NbVL2 * (v->NbTimeStep * 3 * 3 + 9) : 0; v->VL2 = LCD;
-      nb = v->NbTL2 ? v->NbTL2 * (v->NbTimeStep * 3 * 9 + 9) : 0; v->TL2 = LCD;
-
-      // 2nd order Triangles
-      nb = v->NbST2 ? v->NbST2 * (v->NbTimeStep * 6 * 1 + 18) : 0; v->ST2 = LCD;
-      nb = v->NbVT2 ? v->NbVT2 * (v->NbTimeStep * 6 * 3 + 18) : 0; v->VT2 = LCD;
-      nb = v->NbTT2 ? v->NbTT2 * (v->NbTimeStep * 6 * 9 + 18) : 0; v->TT2 = LCD;
-
-      // 2nd order Quadrangles
-      nb = v->NbSQ2 ? v->NbSQ2 * (v->NbTimeStep * 9 * 1 + 27) : 0; v->SQ2 = LCD;
-      nb = v->NbVQ2 ? v->NbVQ2 * (v->NbTimeStep * 9 * 3 + 27) : 0; v->VQ2 = LCD;
-      nb = v->NbTQ2 ? v->NbTQ2 * (v->NbTimeStep * 9 * 9 + 27) : 0; v->TQ2 = LCD;
-
-      // 2nd order Tetrahedra
-      nb = v->NbSS2 ? v->NbSS2 * (v->NbTimeStep * 10 * 1 + 30) : 0; v->SS2 = LCD;
-      nb = v->NbVS2 ? v->NbVS2 * (v->NbTimeStep * 10 * 3 + 30) : 0; v->VS2 = LCD;
-      nb = v->NbTS2 ? v->NbTS2 * (v->NbTimeStep * 10 * 9 + 30) : 0; v->TS2 = LCD;
-
-      // 2nd order Hexahedra
-      nb = v->NbSH2 ? v->NbSH2 * (v->NbTimeStep * 27 * 1 + 81) : 0; v->SH2 = LCD;
-      nb = v->NbVH2 ? v->NbVH2 * (v->NbTimeStep * 27 * 3 + 81) : 0; v->VH2 = LCD;
-      nb = v->NbTH2 ? v->NbTH2 * (v->NbTimeStep * 27 * 9 + 81) : 0; v->TH2 = LCD;
-
-      // 2nd order Prisms
-      nb = v->NbSI2 ? v->NbSI2 * (v->NbTimeStep * 18 * 1 + 54) : 0; v->SI2 = LCD;
-      nb = v->NbVI2 ? v->NbVI2 * (v->NbTimeStep * 18 * 3 + 54) : 0; v->VI2 = LCD;
-      nb = v->NbTI2 ? v->NbTI2 * (v->NbTimeStep * 18 * 9 + 54) : 0; v->TI2 = LCD;
-
-      // 2nd order Pyramids
-      nb = v->NbSY2 ? v->NbSY2 * (v->NbTimeStep * 14 * 1 + 42) : 0; v->SY2 = LCD;
-      nb = v->NbVY2 ? v->NbVY2 * (v->NbTimeStep * 14 * 3 + 42) : 0; v->VY2 = LCD;
-      nb = v->NbTY2 ? v->NbTY2 * (v->NbTimeStep * 14 * 9 + 42) : 0; v->TY2 = LCD;
-
-#undef LCD
-
-      // 2D strings
-      nb = v->NbT2 ? v->NbT2 * 4 : 0;
-      v->T2D = List_CreateFromFile(nb, 100, size, file, format, swap);
-      if(version <= 1.2)
-	v->T2C = List_CreateFromFileOld(t2l, 100, sizeof(char), file, format, swap);
-      else
-	v->T2C = List_CreateFromFile(t2l, 100, sizeof(char), file, format, swap);
-
-      // 3D strings
-      nb = v->NbT3 ? v->NbT3 * 5 : 0;
-      v->T3D = List_CreateFromFile(nb, 100, size, file, format, swap);
-      if(version <= 1.2)
-	v->T3C = List_CreateFromFileOld(t3l, 100, sizeof(char), file, format, swap);
-      else
-	v->T3C = List_CreateFromFile(t3l, 100, sizeof(char), file, format, swap);
-
-      Msg(DEBUG,
-          "Read View '%s' (%d TimeSteps): "
-	  "SP(%d/%d) VP(%d/%d) TP(%d/%d) "     
-	  "SL(%d/%d) VL(%d/%d) TL(%d/%d) "
-	  "ST(%d/%d) VT(%d/%d) TT(%d/%d) "
-	  "SQ(%d/%d) VQ(%d/%d) TQ(%d/%d) "
-	  "SS(%d/%d) VS(%d/%d) TS(%d/%d) "
-	  "SH(%d/%d) VH(%d/%d) TH(%d/%d) "
-	  "SI(%d/%d) VI(%d/%d) TI(%d/%d) "
-	  "SY(%d/%d) VY(%d/%d) TY(%d/%d) " 
-	  "SL2(%d/%d) VL2(%d/%d) TL2(%d/%d) "
-	  "ST2(%d/%d) VT2(%d/%d) TT2(%d/%d) "
-	  "SQ2(%d/%d) VQ2(%d/%d) TQ2(%d/%d) "
-	  "SS2(%d/%d) VS2(%d/%d) TS2(%d/%d) " 
-	  "SH2(%d/%d) VH2(%d/%d) TH2(%d/%d) "
-	  "SI2(%d/%d) VI2(%d/%d) TI2(%d/%d) "
-	  "SY2(%d/%d) VY2(%d/%d) TY2(%d/%d) "
-	  "T2(%d/%d/%d) T3(%d/%d/%d) ", 
-	  name, v->NbTimeStep,
-          v->NbSP, List_Nbr(v->SP), v->NbVP, List_Nbr(v->VP), v->NbTP, List_Nbr(v->TP),
-          v->NbSL, List_Nbr(v->SL), v->NbVL, List_Nbr(v->VL), v->NbTL, List_Nbr(v->TL),
-          v->NbST, List_Nbr(v->ST), v->NbVT, List_Nbr(v->VT), v->NbTT, List_Nbr(v->TT),
-          v->NbSQ, List_Nbr(v->SQ), v->NbVQ, List_Nbr(v->VQ), v->NbTQ, List_Nbr(v->TQ),
-          v->NbSS, List_Nbr(v->SS), v->NbVS, List_Nbr(v->VS), v->NbTS, List_Nbr(v->TS),
-          v->NbSH, List_Nbr(v->SH), v->NbVH, List_Nbr(v->VH), v->NbTH, List_Nbr(v->TH),
-          v->NbSI, List_Nbr(v->SI), v->NbVI, List_Nbr(v->VI), v->NbTI, List_Nbr(v->TI),
-          v->NbSY, List_Nbr(v->SY), v->NbVY, List_Nbr(v->VY), v->NbTY, List_Nbr(v->TY),
-          v->NbSL2, List_Nbr(v->SL2), v->NbVL2, List_Nbr(v->VL2), v->NbTL2, List_Nbr(v->TL2),
-          v->NbST2, List_Nbr(v->ST2), v->NbVT2, List_Nbr(v->VT2), v->NbTT2, List_Nbr(v->TT2),
-          v->NbSQ2, List_Nbr(v->SQ2), v->NbVQ2, List_Nbr(v->VQ2), v->NbTQ2, List_Nbr(v->TQ2),
-          v->NbSS2, List_Nbr(v->SS2), v->NbVS2, List_Nbr(v->VS2), v->NbTS2, List_Nbr(v->TS2),
-          v->NbSH2, List_Nbr(v->SH2), v->NbVH2, List_Nbr(v->VH2), v->NbTH2, List_Nbr(v->TH2),
-          v->NbSI2, List_Nbr(v->SI2), v->NbVI2, List_Nbr(v->VI2), v->NbTI2, List_Nbr(v->TI2),
-          v->NbSY2, List_Nbr(v->SY2), v->NbVY2, List_Nbr(v->VY2), v->NbTY2, List_Nbr(v->TY2),
-	  v->NbT2, List_Nbr(v->T2D), List_Nbr(v->T2C), 
-	  v->NbT3, List_Nbr(v->T3D), List_Nbr(v->T3C));
-      
-      // don't update the ui after each view, but only at the end
-      EndView(v, 0, filename, name); 
-    }
-
-    do {
-      if(!fgets(str, 256, file))
-	Msg(GERROR, "Prematured end of file");
-      if(feof(file))
-        Msg(GERROR, "Prematured end of file");
-    } while(str[0] != '$');
-
-  }     /* while 1 ... */
-
-#if defined(HAVE_FLTK)
-  UpdateViewsInGUI();
-#endif
-
-  Msg(INFO, "Read post-processing file '%s'", filename);
-  Msg(STATUS2N, "Read '%s'", filename);
-}
-
-static void write_parsed_time(List_T *list, FILE *fp)
-{
-  if(List_Nbr(list) > 1) {
-    fprintf(fp, "TIME{");
-    for(int i = 0; i < List_Nbr(list); i ++) {
-      if(i) fprintf(fp, ",");
-      fprintf(fp, "%.16g", *(double *)List_Pointer(list, i));
-    }
-    fprintf(fp, "};\n");
-  }
-}
-
-static void write_parsed_elements(char *str, int nbnod, int nb, List_T *list, FILE *fp)
-{
-  if(nb) {
-    int n = List_Nbr(list) / nb;
-    for(int i = 0; i < List_Nbr(list); i += n) {
-      double *x = (double *)List_Pointer(list, i);
-      double *y = (double *)List_Pointer(list, i + nbnod);
-      double *z = (double *)List_Pointer(list, i + 2 * nbnod);
-      fprintf(fp, "%s(", str);
-      for(int j = 0; j < nbnod; j++) {
-	if(j) fprintf(fp, ",");
-	fprintf(fp, "%.16g,%.16g,%.16g", x[j], y[j], z[j]);
-      }
-      fprintf(fp, "){");
-      for(int j = 3 * nbnod; j < n; j++) {
-	if(j - 3 * nbnod) fprintf(fp, ",");
-	fprintf(fp, "%.16g", *(double *)List_Pointer(list, i + j));
-      }
-      fprintf(fp, "};\n");
-    }
-  }
-}
-
-static void write_parsed_strings(int nbc, int nb, List_T *TD, List_T *TC, FILE *fp)
-{
-  if(!nb || (nbc != 4 && nbc != 5)) return;
-  for(int j = 0; j < List_Nbr(TD); j += nbc){
-    double x, y, z, style, start, end;
-    List_Read(TD, j, &x);
-    List_Read(TD, j+1, &y);
-    if(nbc == 5)
-      List_Read(TD, j+2, &z);
-    List_Read(TD, j+nbc-2, &style);
-    if(nbc == 4)
-      fprintf(fp, "T2(%g,%g,%g){", x, y, style);
-    else
-      fprintf(fp, "T3(%g,%g,%g,%g){", x, y, z, style);
-    List_Read(TD, j+nbc-1, &start);
-    if(j+nbc*2-1 < List_Nbr(TD))
-      List_Read(TD, j+nbc*2-1, &end);
-    else
-      end = List_Nbr(TC);
-    int l = 0;
-    while(l < end-start){
-      char *str = (char*)List_Pointer(TC, (int)start + l);
-      if(l) fprintf(fp, ",");
-      fprintf(fp, "\"%s\"", str);
-      l += strlen(str)+1;
-    }
-    fprintf(fp, "};\n");
-  }
-}
-
-static void write_stl(FILE *file, int nbelm, List_T *list, int nbnod)
-{
-  if(nbelm){
-    int nb = List_Nbr(list) / nbelm;
-    for(int i = 0; i < List_Nbr(list); i+=nb){
-      double *x = (double*)List_Pointer(list, i);
-      double n[3];
-      normal3points(x[0], x[3], x[6],
-		    x[1], x[4], x[7],
-		    x[2], x[5], x[8], n);
-      if(nbnod == 3){
-	fprintf(file, "facet normal %g %g %g\n", n[0], n[1], n[2]);
-	fprintf(file, "  outer loop\n");
-	fprintf(file, "    vertex %g %g %g\n", x[0], x[3], x[6]);
-	fprintf(file, "    vertex %g %g %g\n", x[1], x[4], x[7]);
-	fprintf(file, "    vertex %g %g %g\n", x[2], x[5], x[8]);
-	fprintf(file, "  endloop\n");
-	fprintf(file, "endfacet\n");
-      }
-      else{
-	fprintf(file, "facet normal %g %g %g\n", n[0], n[1], n[2]);
-	fprintf(file, "  outer loop\n");
-	fprintf(file, "    vertex %g %g %g\n", x[0], x[4], x[8]);
-	fprintf(file, "    vertex %g %g %g\n", x[1], x[5], x[9]);
-	fprintf(file, "    vertex %g %g %g\n", x[2], x[6], x[10]);
-	fprintf(file, "  endloop\n");
-	fprintf(file, "endfacet\n");
-	fprintf(file, "facet normal %g %g %g\n", n[0], n[1], n[2]);
-	fprintf(file, "  outer loop\n");
-	fprintf(file, "    vertex %g %g %g\n", x[0], x[4], x[8]);
-	fprintf(file, "    vertex %g %g %g\n", x[2], x[6], x[10]);
-	fprintf(file, "    vertex %g %g %g\n", x[3], x[7], x[11]);
-	fprintf(file, "  endloop\n");
-	fprintf(file, "endfacet\n");
-      }
-    }
-  }
-}
-
-void WriteViewSTL(Post_View *v, char *filename)
-{
-  if(!v->NbST && !v->NbVT && !v->NbTT &&
-     !v->NbSQ && !v->NbVQ && !v->NbTQ){
-    Msg(GERROR, "No surface elements to save");
-    return;
-  }
-
-  FILE *file = fopen(filename, "w");
-  if(!file){
-    Msg(GERROR, "Unable to open file '%s'", filename);
-    return;
-  }
-  
-  fprintf(file, "solid Created by Gmsh\n");
-  write_stl(file, v->NbST, v->ST, 3);
-  write_stl(file, v->NbVT, v->VT, 3);
-  write_stl(file, v->NbTT, v->TT, 3);
-  write_stl(file, v->NbSQ, v->SQ, 4);
-  write_stl(file, v->NbVQ, v->VQ, 4);
-  write_stl(file, v->NbTQ, v->TQ, 4);
-  fprintf(file, "endsolid Created by Gmsh\n");
-
-  Msg(INFO, "Wrote view '%s' in STL file '%s'", v->Name, filename);
-  Msg(STATUS2N, "Wrote '%s'", filename);
-
-  fclose(file);
-}
-
-static void write_txt(FILE *file, int nbelm, List_T *list,
-		      int nbnod, int nbcomp, int nbtime)
-{
-  if(nbelm){
-    int nb = List_Nbr(list) / nbelm;
-    for(int i = 0; i < List_Nbr(list); i+=nb){
-      double *x = (double*)List_Pointer(list, i);
-      for(int j = 0; j < nbnod*(3+nbcomp*nbtime); j++)
-	fprintf(file, "%.16g ", x[j]);
-      fprintf(file, "\n");
-    }
-    fprintf(file, "\n");
-  }
-}
-
-// Change this to have 2 choices: 
-// Tabular (By Element)
-// Tabular (By Time Step)
-
-void WriteViewTXT(Post_View *v, char *filename)
-{
-  FILE *file = fopen(filename, "w");
-  if(!file){
-    Msg(GERROR, "Unable to open file '%s'", filename);
-    return;
-  }
-  
-  write_txt(file, v->NbSP, v->SP, 1, 1, v->NbTimeStep);
-  write_txt(file, v->NbVP, v->VP, 1, 3, v->NbTimeStep);
-  write_txt(file, v->NbTP, v->TP, 1, 9, v->NbTimeStep);
-  write_txt(file, v->NbSL, v->SL, 2, 1, v->NbTimeStep);
-  write_txt(file, v->NbVL, v->VL, 2, 3, v->NbTimeStep);
-  write_txt(file, v->NbTL, v->TL, 2, 9, v->NbTimeStep);
-  write_txt(file, v->NbST, v->ST, 3, 1, v->NbTimeStep);
-  write_txt(file, v->NbVT, v->VT, 3, 3, v->NbTimeStep);
-  write_txt(file, v->NbTT, v->TT, 3, 9, v->NbTimeStep);
-  write_txt(file, v->NbSQ, v->SQ, 4, 1, v->NbTimeStep);
-  write_txt(file, v->NbVQ, v->VQ, 4, 3, v->NbTimeStep);
-  write_txt(file, v->NbTQ, v->TQ, 4, 9, v->NbTimeStep);
-  write_txt(file, v->NbSS, v->SS, 4, 1, v->NbTimeStep);
-  write_txt(file, v->NbVS, v->VS, 4, 3, v->NbTimeStep);
-  write_txt(file, v->NbTS, v->TS, 4, 9, v->NbTimeStep);
-  write_txt(file, v->NbSH, v->SH, 8, 1, v->NbTimeStep);
-  write_txt(file, v->NbVH, v->VH, 8, 3, v->NbTimeStep);
-  write_txt(file, v->NbTH, v->TH, 8, 9, v->NbTimeStep);
-  write_txt(file, v->NbSI, v->SI, 6, 1, v->NbTimeStep);
-  write_txt(file, v->NbVI, v->VI, 6, 3, v->NbTimeStep);
-  write_txt(file, v->NbTI, v->TI, 6, 9, v->NbTimeStep);
-  write_txt(file, v->NbSY, v->SY, 5, 1, v->NbTimeStep);
-  write_txt(file, v->NbVY, v->VY, 5, 3, v->NbTimeStep);
-  write_txt(file, v->NbTY, v->TY, 5, 9, v->NbTimeStep);
-
-  Msg(INFO, "Wrote view '%s' in text file '%s'", v->Name, filename);
-  Msg(STATUS2N, "Wrote '%s'", filename);
-  fclose(file);
-}
-
-void WriteView(Post_View *v, char *filename, int format, int append)
-{
-  FILE *file;
-  char name[256];
-  int f, One = 1;
-  int binary = (format == 1) ? 1 : 0;
-  int parsed = (format == 2);
-  int stl = (format == 3);
-  int txt = (format == 4);
-
-  if(stl){
-    WriteViewSTL(v, filename);
-    return;
-  }
-  
-  if(txt){
-    WriteViewTXT(v, filename);
-    return;
-  }
-
-  if(filename) {
-    file = fopen(filename, append ? (binary ? "ab" : "a") : (binary ? "wb" : "w"));
-    if(!file) {
-      Msg(GERROR, "Unable to open file '%s'", filename);
-      return;
-    }
-    if(!append)
-      Msg(INFO, "Writing post-processing file '%s'", filename);
-  }
-  else
-    file = stdout;
-
-  if(!parsed && !append){
-    fprintf(file, "$PostFormat /* Gmsh 1.3, %s */\n",
-	    binary ? "binary" : "ascii");
-    fprintf(file, "1.3 %d %d\n", binary, (int)sizeof(double));
-    fprintf(file, "$EndPostFormat\n");
-  }
-
-  strcpy(name, v->Name);
-  for(int i = 0; i < (int)strlen(name); i++)
-    if(name[i] == ' ') name[i] = '^';
-
-  if(!parsed){
-    fprintf(file, "$View /* %s */\n", v->Name);
-    fprintf(file, "%s ", name);
-    fprintf(file, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
-	    "%d %d %d %d %d %d %d %d %d %d %d %d\n",
-	    List_Nbr(v->Time),
-	    v->NbSP, v->NbVP, v->NbTP, v->NbSL, v->NbVL, v->NbTL,
-	    v->NbST, v->NbVT, v->NbTT, v->NbSQ, v->NbVQ, v->NbTQ,
-	    v->NbSS, v->NbVS, v->NbTS, v->NbSH, v->NbVH, v->NbTH,
-	    v->NbSI, v->NbVI, v->NbTI, v->NbSY, v->NbVY, v->NbTY,
-	    v->NbT2, List_Nbr(v->T2C), v->NbT3, List_Nbr(v->T3C));
-    if(binary) {
-      f = LIST_FORMAT_BINARY;
-      if(!fwrite(&One, sizeof(int), 1, file)){
-	Msg(GERROR, "Write error");
-	return;
-      }
-    }
-    else
-      f = LIST_FORMAT_ASCII;
-    List_WriteToFile(v->Time, file, f);
-    List_WriteToFile(v->SP, file, f);
-    List_WriteToFile(v->VP, file, f);
-    List_WriteToFile(v->TP, file, f);
-    List_WriteToFile(v->SL, file, f);
-    List_WriteToFile(v->VL, file, f);
-    List_WriteToFile(v->TL, file, f);
-    List_WriteToFile(v->ST, file, f);
-    List_WriteToFile(v->VT, file, f);
-    List_WriteToFile(v->TT, file, f);
-    List_WriteToFile(v->SQ, file, f);
-    List_WriteToFile(v->VQ, file, f);
-    List_WriteToFile(v->TQ, file, f);
-    List_WriteToFile(v->SS, file, f);
-    List_WriteToFile(v->VS, file, f);
-    List_WriteToFile(v->TS, file, f);
-    List_WriteToFile(v->SH, file, f);
-    List_WriteToFile(v->VH, file, f);
-    List_WriteToFile(v->TH, file, f);
-    List_WriteToFile(v->SI, file, f);
-    List_WriteToFile(v->VI, file, f);
-    List_WriteToFile(v->TI, file, f);
-    List_WriteToFile(v->SY, file, f);
-    List_WriteToFile(v->VY, file, f);
-    List_WriteToFile(v->TY, file, f);
-    List_WriteToFile(v->T2D, file, f);
-    List_WriteToFile(v->T2C, file, f);
-    List_WriteToFile(v->T3D, file, f);
-    List_WriteToFile(v->T3C, file, f);
-    fprintf(file, "\n");
-    fprintf(file, "$EndView\n");
-  }
-  else{
-    fprintf(file, "View \"%s\" {\n", v->Name);
-    write_parsed_time(v->Time, file);
-    write_parsed_elements("SP", 1, v->NbSP, v->SP, file);
-    write_parsed_elements("VP", 1, v->NbVP, v->VP, file);
-    write_parsed_elements("TP", 1, v->NbTP, v->TP, file);
-    write_parsed_elements("SL", 2, v->NbSL, v->SL, file);
-    write_parsed_elements("VL", 2, v->NbVL, v->VL, file);
-    write_parsed_elements("TL", 2, v->NbTL, v->TL, file);
-    write_parsed_elements("ST", 3, v->NbST, v->ST, file);
-    write_parsed_elements("VT", 3, v->NbVT, v->VT, file);
-    write_parsed_elements("TT", 3, v->NbTT, v->TT, file);
-    write_parsed_elements("SQ", 4, v->NbSQ, v->SQ, file);
-    write_parsed_elements("VQ", 4, v->NbVQ, v->VQ, file);
-    write_parsed_elements("TQ", 4, v->NbTQ, v->TQ, file);
-    write_parsed_elements("SS", 4, v->NbSS, v->SS, file);
-    write_parsed_elements("VS", 4, v->NbVS, v->VS, file);
-    write_parsed_elements("TS", 4, v->NbTS, v->TS, file);
-    write_parsed_elements("SH", 8, v->NbSH, v->SH, file);
-    write_parsed_elements("VH", 8, v->NbVH, v->VH, file);
-    write_parsed_elements("TH", 8, v->NbTH, v->TH, file);
-    write_parsed_elements("SI", 6, v->NbSI, v->SI, file);
-    write_parsed_elements("VI", 6, v->NbVI, v->VI, file);
-    write_parsed_elements("TI", 6, v->NbTI, v->TI, file);
-    write_parsed_elements("SY", 5, v->NbSY, v->SY, file);
-    write_parsed_elements("VY", 5, v->NbVY, v->VY, file);
-    write_parsed_elements("TY", 5, v->NbTY, v->TY, file);
-    write_parsed_strings(4, v->NbT2, v->T2D, v->T2C, file);
-    write_parsed_strings(5, v->NbT3, v->T3D, v->T3C, file);
-    fprintf(file, "};\n");
-  }
-
-  if(filename) {
-    fclose(file);
-    Msg(INFO, "Wrote view '%s' in post-processing file '%s'", v->Name, filename);
-    Msg(STATUS2N, "Wrote '%s'", filename);
-  }
-
-}
-
 // Transform curved elements into linear ones and delete all the
 // curved element data. This is a temporary solution, until we can use
 // an Adaptive_Post_View on curved elements, too.
diff --git a/Common/ViewsIO.cpp b/Common/ViewsIO.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c8102f85a8a689bbf480f1fe5e501be0ebcaf099
--- /dev/null
+++ b/Common/ViewsIO.cpp
@@ -0,0 +1,828 @@
+// $Id: ViewsIO.cpp,v 1.1 2006-01-27 21:15:30 geuzaine Exp $
+//
+// Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+// 
+// Please report all bugs and problems to <gmsh@geuz.org>.
+
+#include <set>
+#include "Gmsh.h"
+#include "Numeric.h"
+#include "Views.h"
+#include "Context.h"
+
+extern Context_T CTX;
+
+#if defined(HAVE_FLTK)
+void UpdateViewsInGUI();
+#endif
+
+// Read view from file
+
+void ReadView(FILE *file, char *filename)
+{
+  char str[256], name[256];
+  int i, nb, format, size, testone, swap, t2l, t3l;
+  double version;
+  Post_View *v;
+
+  Msg(INFO, "Reading post-processing file '%s'", filename);
+
+  while(1) {
+
+    do {
+      if(!fgets(str, 256, file))
+	break;
+      if(feof(file))
+        break;
+    } while(str[0] != '$');
+
+    if(feof(file))
+      break;
+
+    if(!strncmp(&str[1], "PostFormat", 10)) {
+      if(!fscanf(file, "%lf %d %d\n", &version, &format, &size)){
+        Msg(GERROR, "Read error");
+        return;
+      }
+      if(version < 1.0) {
+        Msg(GERROR, "This post-processing file is too old (version %g < 1.0)",
+            version);
+        return;
+      }
+      if(size == sizeof(double))
+        Msg(DEBUG, "Data is in double precision format (size==%d)", size);
+      else if(size == sizeof(float))
+        Msg(DEBUG, "Data is in single precision format (size==%d)", size);
+      else {
+        Msg(GERROR, "Unknown data size (%d) in post-processing file", size);
+        return;
+      }
+      if(format == 0)
+        format = LIST_FORMAT_ASCII;
+      else if(format == 1)
+        format = LIST_FORMAT_BINARY;
+      else {
+        Msg(GERROR, "Unknown format for view");
+        return;
+      }
+    }
+
+
+    if(!strncmp(&str[1], "View", 4)) {
+      v = BeginView(0);
+      if(version <= 1.0) {
+        Msg(DEBUG, "Detected post-processing view format <= 1.0");
+        if(!fscanf(file, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
+		   name, &v->NbTimeStep,
+		   &v->NbSP, &v->NbVP, &v->NbTP, &v->NbSL, &v->NbVL, &v->NbTL,
+		   &v->NbST, &v->NbVT, &v->NbTT, &v->NbSS, &v->NbVS, &v->NbTS)){
+	  Msg(GERROR, "Read error");
+	  return;
+	}
+        v->NbT2 = t2l = v->NbT3 = t3l = 0;
+      }
+      else if(version == 1.1) {
+        Msg(DEBUG, "Detected post-processing view format 1.1");
+        if(!fscanf(file,
+		   "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
+		   name, &v->NbTimeStep, &v->NbSP, &v->NbVP, &v->NbTP, &v->NbSL,
+		   &v->NbVL, &v->NbTL, &v->NbST, &v->NbVT, &v->NbTT, &v->NbSS,
+		   &v->NbVS, &v->NbTS, &v->NbT2, &t2l, &v->NbT3, &t3l)){
+	  Msg(GERROR, "Read error");
+	  return;
+	}
+      }
+      else if(version == 1.2 || version == 1.3) {
+        Msg(DEBUG, "Detected post-processing view format %g", version);
+        if(!fscanf(file, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
+		   "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
+		   name, &v->NbTimeStep,
+		   &v->NbSP, &v->NbVP, &v->NbTP, &v->NbSL, &v->NbVL, &v->NbTL,
+		   &v->NbST, &v->NbVT, &v->NbTT, &v->NbSQ, &v->NbVQ, &v->NbTQ,
+		   &v->NbSS, &v->NbVS, &v->NbTS, &v->NbSH, &v->NbVH, &v->NbTH,
+		   &v->NbSI, &v->NbVI, &v->NbTI, &v->NbSY, &v->NbVY, &v->NbTY,
+		   &v->NbT2, &t2l, &v->NbT3, &t3l)){
+	  Msg(GERROR, "Read error");
+	  return;
+	}
+      }
+      else if(version == 1.4) {
+        Msg(DEBUG, "Detected post-processing view format 1.4");
+        if(!fscanf(file, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
+		   "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
+		   "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
+		   name, &v->NbTimeStep,
+		   &v->NbSP, &v->NbVP, &v->NbTP, &v->NbSL, &v->NbVL, &v->NbTL,
+		   &v->NbST, &v->NbVT, &v->NbTT, &v->NbSQ, &v->NbVQ, &v->NbTQ,
+		   &v->NbSS, &v->NbVS, &v->NbTS, &v->NbSH, &v->NbVH, &v->NbTH,
+		   &v->NbSI, &v->NbVI, &v->NbTI, &v->NbSY, &v->NbVY, &v->NbTY,
+		   &v->NbSL2, &v->NbVL2, &v->NbTL2, &v->NbST2, &v->NbVT2, &v->NbTT2,
+		   &v->NbSQ2, &v->NbVQ2, &v->NbTQ2, &v->NbSS2, &v->NbVS2, &v->NbTS2,
+		   &v->NbSH2, &v->NbVH2, &v->NbTH2, &v->NbSI2, &v->NbVI2, &v->NbTI2,
+		   &v->NbSY2, &v->NbVY2, &v->NbTY2, &v->NbT2, &t2l, &v->NbT3, &t3l)){
+	  Msg(GERROR, "Read error");
+	  return;
+	}
+      }
+      else {
+        Msg(GERROR, "Unknown post-processing file format (version %g)",
+            version);
+        return;
+      }
+
+      for(i = 0; i < (int)strlen(name); i++)
+        if(name[i] == '^')
+          name[i] = ' ';
+
+      swap = 0;
+      if(format == LIST_FORMAT_BINARY) {
+        if(!fread(&testone, sizeof(int), 1, file)){
+	  Msg(GERROR, "Read error");
+	  return;
+	}
+        if(testone != 1) {
+          Msg(INFO, "Swapping bytes from binary file");
+          swap = 1;
+        }
+      }
+
+      v->DataSize = size;
+
+      // Time values
+      v->Time = List_CreateFromFile(v->NbTimeStep, 100, size, file, format, swap);
+
+      // Note: if nb==0, we still allocates the lists (so that they
+      // are ready to be filled later, e.g. in plugins)
+
+#define LCD List_CreateFromFile(nb, 1000, size, file, format, swap)
+
+      // Points
+      nb = v->NbSP ? v->NbSP * (v->NbTimeStep * 1 + 3) : 0; v->SP = LCD;
+      nb = v->NbVP ? v->NbVP * (v->NbTimeStep * 3 + 3) : 0; v->VP = LCD;
+      nb = v->NbTP ? v->NbTP * (v->NbTimeStep * 9 + 3) : 0; v->TP = LCD;
+
+      // Lines
+      nb = v->NbSL ? v->NbSL * (v->NbTimeStep * 2 * 1 + 6) : 0; v->SL = LCD;
+      nb = v->NbVL ? v->NbVL * (v->NbTimeStep * 2 * 3 + 6) : 0; v->VL = LCD;
+      nb = v->NbTL ? v->NbTL * (v->NbTimeStep * 2 * 9 + 6) : 0; v->TL = LCD;
+
+      // Triangles
+      nb = v->NbST ? v->NbST * (v->NbTimeStep * 3 * 1 + 9) : 0; v->ST = LCD;
+      nb = v->NbVT ? v->NbVT * (v->NbTimeStep * 3 * 3 + 9) : 0; v->VT = LCD;
+      nb = v->NbTT ? v->NbTT * (v->NbTimeStep * 3 * 9 + 9) : 0; v->TT = LCD;
+
+      // Quadrangles
+      nb = v->NbSQ ? v->NbSQ * (v->NbTimeStep * 4 * 1 + 12) : 0; v->SQ = LCD;
+      nb = v->NbVQ ? v->NbVQ * (v->NbTimeStep * 4 * 3 + 12) : 0; v->VQ = LCD;
+      nb = v->NbTQ ? v->NbTQ * (v->NbTimeStep * 4 * 9 + 12) : 0; v->TQ = LCD;
+
+      // Tetrahedra
+      nb = v->NbSS ? v->NbSS * (v->NbTimeStep * 4 * 1 + 12) : 0; v->SS = LCD;
+      nb = v->NbVS ? v->NbVS * (v->NbTimeStep * 4 * 3 + 12) : 0; v->VS = LCD;
+      nb = v->NbTS ? v->NbTS * (v->NbTimeStep * 4 * 9 + 12) : 0; v->TS = LCD;
+
+      // Hexahedra
+      nb = v->NbSH ? v->NbSH * (v->NbTimeStep * 8 * 1 + 24) : 0; v->SH = LCD;
+      nb = v->NbVH ? v->NbVH * (v->NbTimeStep * 8 * 3 + 24) : 0; v->VH = LCD;
+      nb = v->NbTH ? v->NbTH * (v->NbTimeStep * 8 * 9 + 24) : 0; v->TH = LCD;
+
+      // Prisms
+      nb = v->NbSI ? v->NbSI * (v->NbTimeStep * 6 * 1 + 18) : 0; v->SI = LCD;
+      nb = v->NbVI ? v->NbVI * (v->NbTimeStep * 6 * 3 + 18) : 0; v->VI = LCD;
+      nb = v->NbTI ? v->NbTI * (v->NbTimeStep * 6 * 9 + 18) : 0; v->TI = LCD;
+
+      // Pyramids
+      nb = v->NbSY ? v->NbSY * (v->NbTimeStep * 5 * 1 + 15) : 0; v->SY = LCD;
+      nb = v->NbVY ? v->NbVY * (v->NbTimeStep * 5 * 3 + 15) : 0; v->VY = LCD;
+      nb = v->NbTY ? v->NbTY * (v->NbTimeStep * 5 * 9 + 15) : 0; v->TY = LCD;
+
+      // 2nd order Lines
+      nb = v->NbSL2 ? v->NbSL2 * (v->NbTimeStep * 3 * 1 + 9) : 0; v->SL2 = LCD;
+      nb = v->NbVL2 ? v->NbVL2 * (v->NbTimeStep * 3 * 3 + 9) : 0; v->VL2 = LCD;
+      nb = v->NbTL2 ? v->NbTL2 * (v->NbTimeStep * 3 * 9 + 9) : 0; v->TL2 = LCD;
+
+      // 2nd order Triangles
+      nb = v->NbST2 ? v->NbST2 * (v->NbTimeStep * 6 * 1 + 18) : 0; v->ST2 = LCD;
+      nb = v->NbVT2 ? v->NbVT2 * (v->NbTimeStep * 6 * 3 + 18) : 0; v->VT2 = LCD;
+      nb = v->NbTT2 ? v->NbTT2 * (v->NbTimeStep * 6 * 9 + 18) : 0; v->TT2 = LCD;
+
+      // 2nd order Quadrangles
+      nb = v->NbSQ2 ? v->NbSQ2 * (v->NbTimeStep * 9 * 1 + 27) : 0; v->SQ2 = LCD;
+      nb = v->NbVQ2 ? v->NbVQ2 * (v->NbTimeStep * 9 * 3 + 27) : 0; v->VQ2 = LCD;
+      nb = v->NbTQ2 ? v->NbTQ2 * (v->NbTimeStep * 9 * 9 + 27) : 0; v->TQ2 = LCD;
+
+      // 2nd order Tetrahedra
+      nb = v->NbSS2 ? v->NbSS2 * (v->NbTimeStep * 10 * 1 + 30) : 0; v->SS2 = LCD;
+      nb = v->NbVS2 ? v->NbVS2 * (v->NbTimeStep * 10 * 3 + 30) : 0; v->VS2 = LCD;
+      nb = v->NbTS2 ? v->NbTS2 * (v->NbTimeStep * 10 * 9 + 30) : 0; v->TS2 = LCD;
+
+      // 2nd order Hexahedra
+      nb = v->NbSH2 ? v->NbSH2 * (v->NbTimeStep * 27 * 1 + 81) : 0; v->SH2 = LCD;
+      nb = v->NbVH2 ? v->NbVH2 * (v->NbTimeStep * 27 * 3 + 81) : 0; v->VH2 = LCD;
+      nb = v->NbTH2 ? v->NbTH2 * (v->NbTimeStep * 27 * 9 + 81) : 0; v->TH2 = LCD;
+
+      // 2nd order Prisms
+      nb = v->NbSI2 ? v->NbSI2 * (v->NbTimeStep * 18 * 1 + 54) : 0; v->SI2 = LCD;
+      nb = v->NbVI2 ? v->NbVI2 * (v->NbTimeStep * 18 * 3 + 54) : 0; v->VI2 = LCD;
+      nb = v->NbTI2 ? v->NbTI2 * (v->NbTimeStep * 18 * 9 + 54) : 0; v->TI2 = LCD;
+
+      // 2nd order Pyramids
+      nb = v->NbSY2 ? v->NbSY2 * (v->NbTimeStep * 14 * 1 + 42) : 0; v->SY2 = LCD;
+      nb = v->NbVY2 ? v->NbVY2 * (v->NbTimeStep * 14 * 3 + 42) : 0; v->VY2 = LCD;
+      nb = v->NbTY2 ? v->NbTY2 * (v->NbTimeStep * 14 * 9 + 42) : 0; v->TY2 = LCD;
+
+#undef LCD
+
+      // 2D strings
+      nb = v->NbT2 ? v->NbT2 * 4 : 0;
+      v->T2D = List_CreateFromFile(nb, 100, size, file, format, swap);
+      if(version <= 1.2)
+	v->T2C = List_CreateFromFileOld(t2l, 100, sizeof(char), file, format, swap);
+      else
+	v->T2C = List_CreateFromFile(t2l, 100, sizeof(char), file, format, swap);
+
+      // 3D strings
+      nb = v->NbT3 ? v->NbT3 * 5 : 0;
+      v->T3D = List_CreateFromFile(nb, 100, size, file, format, swap);
+      if(version <= 1.2)
+	v->T3C = List_CreateFromFileOld(t3l, 100, sizeof(char), file, format, swap);
+      else
+	v->T3C = List_CreateFromFile(t3l, 100, sizeof(char), file, format, swap);
+
+      Msg(DEBUG,
+          "Read View '%s' (%d TimeSteps): "
+	  "SP(%d/%d) VP(%d/%d) TP(%d/%d) "
+	  "SL(%d/%d) VL(%d/%d) TL(%d/%d) "
+	  "ST(%d/%d) VT(%d/%d) TT(%d/%d) "
+	  "SQ(%d/%d) VQ(%d/%d) TQ(%d/%d) "
+	  "SS(%d/%d) VS(%d/%d) TS(%d/%d) "
+	  "SH(%d/%d) VH(%d/%d) TH(%d/%d) "
+	  "SI(%d/%d) VI(%d/%d) TI(%d/%d) "
+	  "SY(%d/%d) VY(%d/%d) TY(%d/%d) " 
+	  "SL2(%d/%d) VL2(%d/%d) TL2(%d/%d) "
+	  "ST2(%d/%d) VT2(%d/%d) TT2(%d/%d) "
+	  "SQ2(%d/%d) VQ2(%d/%d) TQ2(%d/%d) "
+	  "SS2(%d/%d) VS2(%d/%d) TS2(%d/%d) " 
+	  "SH2(%d/%d) VH2(%d/%d) TH2(%d/%d) "
+	  "SI2(%d/%d) VI2(%d/%d) TI2(%d/%d) "
+	  "SY2(%d/%d) VY2(%d/%d) TY2(%d/%d) "
+	  "T2(%d/%d/%d) T3(%d/%d/%d) ", 
+	  name, v->NbTimeStep,
+          v->NbSP, List_Nbr(v->SP), v->NbVP, List_Nbr(v->VP), v->NbTP, List_Nbr(v->TP),
+          v->NbSL, List_Nbr(v->SL), v->NbVL, List_Nbr(v->VL), v->NbTL, List_Nbr(v->TL),
+          v->NbST, List_Nbr(v->ST), v->NbVT, List_Nbr(v->VT), v->NbTT, List_Nbr(v->TT),
+          v->NbSQ, List_Nbr(v->SQ), v->NbVQ, List_Nbr(v->VQ), v->NbTQ, List_Nbr(v->TQ),
+          v->NbSS, List_Nbr(v->SS), v->NbVS, List_Nbr(v->VS), v->NbTS, List_Nbr(v->TS),
+          v->NbSH, List_Nbr(v->SH), v->NbVH, List_Nbr(v->VH), v->NbTH, List_Nbr(v->TH),
+          v->NbSI, List_Nbr(v->SI), v->NbVI, List_Nbr(v->VI), v->NbTI, List_Nbr(v->TI),
+          v->NbSY, List_Nbr(v->SY), v->NbVY, List_Nbr(v->VY), v->NbTY, List_Nbr(v->TY),
+          v->NbSL2, List_Nbr(v->SL2), v->NbVL2, List_Nbr(v->VL2), v->NbTL2, List_Nbr(v->TL2),
+          v->NbST2, List_Nbr(v->ST2), v->NbVT2, List_Nbr(v->VT2), v->NbTT2, List_Nbr(v->TT2),
+          v->NbSQ2, List_Nbr(v->SQ2), v->NbVQ2, List_Nbr(v->VQ2), v->NbTQ2, List_Nbr(v->TQ2),
+          v->NbSS2, List_Nbr(v->SS2), v->NbVS2, List_Nbr(v->VS2), v->NbTS2, List_Nbr(v->TS2),
+          v->NbSH2, List_Nbr(v->SH2), v->NbVH2, List_Nbr(v->VH2), v->NbTH2, List_Nbr(v->TH2),
+          v->NbSI2, List_Nbr(v->SI2), v->NbVI2, List_Nbr(v->VI2), v->NbTI2, List_Nbr(v->TI2),
+          v->NbSY2, List_Nbr(v->SY2), v->NbVY2, List_Nbr(v->VY2), v->NbTY2, List_Nbr(v->TY2),
+	  v->NbT2, List_Nbr(v->T2D), List_Nbr(v->T2C), 
+	  v->NbT3, List_Nbr(v->T3D), List_Nbr(v->T3C));
+      
+      // don't update the ui after each view, but only at the end
+      EndView(v, 0, filename, name); 
+    }
+
+    do {
+      if(!fgets(str, 256, file))
+	Msg(GERROR, "Prematured end of file");
+      if(feof(file))
+        Msg(GERROR, "Prematured end of file");
+    } while(str[0] != '$');
+
+  }     /* while 1 ... */
+
+#if defined(HAVE_FLTK)
+  UpdateViewsInGUI();
+#endif
+
+  Msg(INFO, "Read post-processing file '%s'", filename);
+  Msg(STATUS2N, "Read '%s'", filename);
+}
+
+// Write view to file in Parsed, ASCII or Binary format
+
+static void write_parsed_time(List_T *list, FILE *fp)
+{
+  if(List_Nbr(list) > 1) {
+    fprintf(fp, "TIME{");
+    for(int i = 0; i < List_Nbr(list); i ++) {
+      if(i) fprintf(fp, ",");
+      fprintf(fp, "%.16g", *(double *)List_Pointer(list, i));
+    }
+    fprintf(fp, "};\n");
+  }
+}
+
+static void write_parsed_elements(char *str, int nbnod, int nb, List_T *list, FILE *fp)
+{
+  if(nb) {
+    int n = List_Nbr(list) / nb;
+    for(int i = 0; i < List_Nbr(list); i += n) {
+      double *x = (double *)List_Pointer(list, i);
+      double *y = (double *)List_Pointer(list, i + nbnod);
+      double *z = (double *)List_Pointer(list, i + 2 * nbnod);
+      fprintf(fp, "%s(", str);
+      for(int j = 0; j < nbnod; j++) {
+	if(j) fprintf(fp, ",");
+	fprintf(fp, "%.16g,%.16g,%.16g", x[j], y[j], z[j]);
+      }
+      fprintf(fp, "){");
+      for(int j = 3 * nbnod; j < n; j++) {
+	if(j - 3 * nbnod) fprintf(fp, ",");
+	fprintf(fp, "%.16g", *(double *)List_Pointer(list, i + j));
+      }
+      fprintf(fp, "};\n");
+    }
+  }
+}
+
+static void write_parsed_strings(int nbc, int nb, List_T *TD, List_T *TC, FILE *fp)
+{
+  if(!nb || (nbc != 4 && nbc != 5)) return;
+  for(int j = 0; j < List_Nbr(TD); j += nbc){
+    double x, y, z, style, start, end;
+    List_Read(TD, j, &x);
+    List_Read(TD, j+1, &y);
+    if(nbc == 5)
+      List_Read(TD, j+2, &z);
+    List_Read(TD, j+nbc-2, &style);
+    if(nbc == 4)
+      fprintf(fp, "T2(%g,%g,%g){", x, y, style);
+    else
+      fprintf(fp, "T3(%g,%g,%g,%g){", x, y, z, style);
+    List_Read(TD, j+nbc-1, &start);
+    if(j+nbc*2-1 < List_Nbr(TD))
+      List_Read(TD, j+nbc*2-1, &end);
+    else
+      end = List_Nbr(TC);
+    int l = 0;
+    while(l < end-start){
+      char *str = (char*)List_Pointer(TC, (int)start + l);
+      if(l) fprintf(fp, ",");
+      fprintf(fp, "\"%s\"", str);
+      l += strlen(str)+1;
+    }
+    fprintf(fp, "};\n");
+  }
+}
+
+void WriteViewPost(Post_View *v, FILE *file, int binary=0, int parsed=1, int append=0)
+{
+  char name[256];
+  int f, One = 1;
+
+  if(!parsed && !append){
+    fprintf(file, "$PostFormat /* Gmsh 1.3, %s */\n",
+	    binary ? "binary" : "ascii");
+    fprintf(file, "1.3 %d %d\n", binary, (int)sizeof(double));
+    fprintf(file, "$EndPostFormat\n");
+  }
+
+  strcpy(name, v->Name);
+  for(int i = 0; i < (int)strlen(name); i++)
+    if(name[i] == ' ') name[i] = '^';
+
+  if(!parsed){
+    fprintf(file, "$View /* %s */\n", v->Name);
+    fprintf(file, "%s ", name);
+    fprintf(file, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "
+	    "%d %d %d %d %d %d %d %d %d %d %d %d\n",
+	    List_Nbr(v->Time),
+	    v->NbSP, v->NbVP, v->NbTP, v->NbSL, v->NbVL, v->NbTL,
+	    v->NbST, v->NbVT, v->NbTT, v->NbSQ, v->NbVQ, v->NbTQ,
+	    v->NbSS, v->NbVS, v->NbTS, v->NbSH, v->NbVH, v->NbTH,
+	    v->NbSI, v->NbVI, v->NbTI, v->NbSY, v->NbVY, v->NbTY,
+	    v->NbT2, List_Nbr(v->T2C), v->NbT3, List_Nbr(v->T3C));
+    if(binary) {
+      f = LIST_FORMAT_BINARY;
+      if(!fwrite(&One, sizeof(int), 1, file)){
+	Msg(GERROR, "Write error");
+	return;
+      }
+    }
+    else
+      f = LIST_FORMAT_ASCII;
+    List_WriteToFile(v->Time, file, f);
+    List_WriteToFile(v->SP, file, f);
+    List_WriteToFile(v->VP, file, f);
+    List_WriteToFile(v->TP, file, f);
+    List_WriteToFile(v->SL, file, f);
+    List_WriteToFile(v->VL, file, f);
+    List_WriteToFile(v->TL, file, f);
+    List_WriteToFile(v->ST, file, f);
+    List_WriteToFile(v->VT, file, f);
+    List_WriteToFile(v->TT, file, f);
+    List_WriteToFile(v->SQ, file, f);
+    List_WriteToFile(v->VQ, file, f);
+    List_WriteToFile(v->TQ, file, f);
+    List_WriteToFile(v->SS, file, f);
+    List_WriteToFile(v->VS, file, f);
+    List_WriteToFile(v->TS, file, f);
+    List_WriteToFile(v->SH, file, f);
+    List_WriteToFile(v->VH, file, f);
+    List_WriteToFile(v->TH, file, f);
+    List_WriteToFile(v->SI, file, f);
+    List_WriteToFile(v->VI, file, f);
+    List_WriteToFile(v->TI, file, f);
+    List_WriteToFile(v->SY, file, f);
+    List_WriteToFile(v->VY, file, f);
+    List_WriteToFile(v->TY, file, f);
+    List_WriteToFile(v->T2D, file, f);
+    List_WriteToFile(v->T2C, file, f);
+    List_WriteToFile(v->T3D, file, f);
+    List_WriteToFile(v->T3C, file, f);
+    fprintf(file, "\n");
+    fprintf(file, "$EndView\n");
+  }
+  else{
+    fprintf(file, "View \"%s\" {\n", v->Name);
+    write_parsed_time(v->Time, file);
+    write_parsed_elements("SP", 1, v->NbSP, v->SP, file);
+    write_parsed_elements("VP", 1, v->NbVP, v->VP, file);
+    write_parsed_elements("TP", 1, v->NbTP, v->TP, file);
+    write_parsed_elements("SL", 2, v->NbSL, v->SL, file);
+    write_parsed_elements("VL", 2, v->NbVL, v->VL, file);
+    write_parsed_elements("TL", 2, v->NbTL, v->TL, file);
+    write_parsed_elements("ST", 3, v->NbST, v->ST, file);
+    write_parsed_elements("VT", 3, v->NbVT, v->VT, file);
+    write_parsed_elements("TT", 3, v->NbTT, v->TT, file);
+    write_parsed_elements("SQ", 4, v->NbSQ, v->SQ, file);
+    write_parsed_elements("VQ", 4, v->NbVQ, v->VQ, file);
+    write_parsed_elements("TQ", 4, v->NbTQ, v->TQ, file);
+    write_parsed_elements("SS", 4, v->NbSS, v->SS, file);
+    write_parsed_elements("VS", 4, v->NbVS, v->VS, file);
+    write_parsed_elements("TS", 4, v->NbTS, v->TS, file);
+    write_parsed_elements("SH", 8, v->NbSH, v->SH, file);
+    write_parsed_elements("VH", 8, v->NbVH, v->VH, file);
+    write_parsed_elements("TH", 8, v->NbTH, v->TH, file);
+    write_parsed_elements("SI", 6, v->NbSI, v->SI, file);
+    write_parsed_elements("VI", 6, v->NbVI, v->VI, file);
+    write_parsed_elements("TI", 6, v->NbTI, v->TI, file);
+    write_parsed_elements("SY", 5, v->NbSY, v->SY, file);
+    write_parsed_elements("VY", 5, v->NbVY, v->VY, file);
+    write_parsed_elements("TY", 5, v->NbTY, v->TY, file);
+    write_parsed_strings(4, v->NbT2, v->T2D, v->T2C, file);
+    write_parsed_strings(5, v->NbT3, v->T3D, v->T3C, file);
+    fprintf(file, "};\n");
+  }
+}
+
+// Write view to file in STL format
+
+static void write_stl(FILE *file, int nbelm, List_T *list, int nbnod)
+{
+  if(nbelm){
+    int nb = List_Nbr(list) / nbelm;
+    for(int i = 0; i < List_Nbr(list); i+=nb){
+      double *x = (double*)List_Pointer(list, i);
+      double n[3];
+      normal3points(x[0], x[3], x[6],
+		    x[1], x[4], x[7],
+		    x[2], x[5], x[8], n);
+      if(nbnod == 3){
+	fprintf(file, "facet normal %g %g %g\n", n[0], n[1], n[2]);
+	fprintf(file, "  outer loop\n");
+	fprintf(file, "    vertex %g %g %g\n", x[0], x[3], x[6]);
+	fprintf(file, "    vertex %g %g %g\n", x[1], x[4], x[7]);
+	fprintf(file, "    vertex %g %g %g\n", x[2], x[5], x[8]);
+	fprintf(file, "  endloop\n");
+	fprintf(file, "endfacet\n");
+      }
+      else{
+	fprintf(file, "facet normal %g %g %g\n", n[0], n[1], n[2]);
+	fprintf(file, "  outer loop\n");
+	fprintf(file, "    vertex %g %g %g\n", x[0], x[4], x[8]);
+	fprintf(file, "    vertex %g %g %g\n", x[1], x[5], x[9]);
+	fprintf(file, "    vertex %g %g %g\n", x[2], x[6], x[10]);
+	fprintf(file, "  endloop\n");
+	fprintf(file, "endfacet\n");
+	fprintf(file, "facet normal %g %g %g\n", n[0], n[1], n[2]);
+	fprintf(file, "  outer loop\n");
+	fprintf(file, "    vertex %g %g %g\n", x[0], x[4], x[8]);
+	fprintf(file, "    vertex %g %g %g\n", x[2], x[6], x[10]);
+	fprintf(file, "    vertex %g %g %g\n", x[3], x[7], x[11]);
+	fprintf(file, "  endloop\n");
+	fprintf(file, "endfacet\n");
+      }
+    }
+  }
+}
+
+void WriteViewSTL(Post_View *v, FILE *file)
+{
+  if(!v->NbST && !v->NbVT && !v->NbTT &&
+     !v->NbSQ && !v->NbVQ && !v->NbTQ){
+    Msg(GERROR, "No surface elements to save");
+    return;
+  }
+
+  fprintf(file, "solid Created by Gmsh\n");
+  write_stl(file, v->NbST, v->ST, 3);
+  write_stl(file, v->NbVT, v->VT, 3);
+  write_stl(file, v->NbTT, v->TT, 3);
+  write_stl(file, v->NbSQ, v->SQ, 4);
+  write_stl(file, v->NbVQ, v->VQ, 4);
+  write_stl(file, v->NbTQ, v->TQ, 4);
+  fprintf(file, "endsolid Created by Gmsh\n");
+}
+
+// Write view to file in Text format (should change this to have 2
+// choices: "Tabular (By Element)" and "Tabular (By Time Step)")
+
+static void write_txt(FILE *file, int nbelm, List_T *list,
+		      int nbnod, int nbcomp, int nbtime)
+{
+  if(nbelm){
+    int nb = List_Nbr(list) / nbelm;
+    for(int i = 0; i < List_Nbr(list); i+=nb){
+      double *x = (double*)List_Pointer(list, i);
+      for(int j = 0; j < nbnod*(3+nbcomp*nbtime); j++)
+	fprintf(file, "%.16g ", x[j]);
+      fprintf(file, "\n");
+    }
+    fprintf(file, "\n");
+  }
+}
+
+void WriteViewTXT(Post_View *v, FILE *file)
+{
+  write_txt(file, v->NbSP, v->SP, 1, 1, v->NbTimeStep);
+  write_txt(file, v->NbVP, v->VP, 1, 3, v->NbTimeStep);
+  write_txt(file, v->NbTP, v->TP, 1, 9, v->NbTimeStep);
+  write_txt(file, v->NbSL, v->SL, 2, 1, v->NbTimeStep);
+  write_txt(file, v->NbVL, v->VL, 2, 3, v->NbTimeStep);
+  write_txt(file, v->NbTL, v->TL, 2, 9, v->NbTimeStep);
+  write_txt(file, v->NbST, v->ST, 3, 1, v->NbTimeStep);
+  write_txt(file, v->NbVT, v->VT, 3, 3, v->NbTimeStep);
+  write_txt(file, v->NbTT, v->TT, 3, 9, v->NbTimeStep);
+  write_txt(file, v->NbSQ, v->SQ, 4, 1, v->NbTimeStep);
+  write_txt(file, v->NbVQ, v->VQ, 4, 3, v->NbTimeStep);
+  write_txt(file, v->NbTQ, v->TQ, 4, 9, v->NbTimeStep);
+  write_txt(file, v->NbSS, v->SS, 4, 1, v->NbTimeStep);
+  write_txt(file, v->NbVS, v->VS, 4, 3, v->NbTimeStep);
+  write_txt(file, v->NbTS, v->TS, 4, 9, v->NbTimeStep);
+  write_txt(file, v->NbSH, v->SH, 8, 1, v->NbTimeStep);
+  write_txt(file, v->NbVH, v->VH, 8, 3, v->NbTimeStep);
+  write_txt(file, v->NbTH, v->TH, 8, 9, v->NbTimeStep);
+  write_txt(file, v->NbSI, v->SI, 6, 1, v->NbTimeStep);
+  write_txt(file, v->NbVI, v->VI, 6, 3, v->NbTimeStep);
+  write_txt(file, v->NbTI, v->TI, 6, 9, v->NbTimeStep);
+  write_txt(file, v->NbSY, v->SY, 5, 1, v->NbTimeStep);
+  write_txt(file, v->NbVY, v->VY, 5, 3, v->NbTimeStep);
+  write_txt(file, v->NbTY, v->TY, 5, 9, v->NbTimeStep);
+}
+
+// Write view to file in MSH format
+
+class Nod{
+ public:
+  int Num;
+  double X, Y, Z;
+  Nod() : Num(0), X(0.), Y(0.), Z(0.) {}
+  Nod(double x, double y, double z) : Num(0), X(x), Y(y), Z(z) {}
+};
+
+class NodCompPos{
+ public:
+  bool operator()(const Nod ent1, const Nod ent2) const
+  {
+    double tol = CTX.lc * 1.e-10 ;
+    if(ent1.X - ent2.X  >  tol) return true;
+    if(ent1.X - ent2.X  < -tol) return false;
+    if(ent1.Y - ent2.Y  >  tol) return true;
+    if(ent1.Y - ent2.Y  < -tol) return false;
+    if(ent1.Z - ent2.Z  >  tol) return true;
+    return false;
+  }
+};
+
+static void get_nod(int nbelm, List_T *list, int nbnod, int nbcomp, 
+		    std::set<Nod, NodCompPos> *nodes,
+		    int *numelm)
+{
+  if(nbelm){
+    int nb = List_Nbr(list) / nbelm;
+    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);
+      for(int j = 0; j < nbnod; j++) {
+	Nod n(x[j], y[j], z[j]);
+	std::set<Nod, NodCompPos>::iterator it = nodes->find(n);
+	if(it == nodes->end()){
+	  n.Num = nodes->size() + 1;
+	  nodes->insert(n);
+	}
+      }
+      (*numelm)++;
+    }
+  }
+}
+
+static void print_elm(FILE *file, int num, int nbnod, Nod nod[8], 
+		      int nbcomp, double *vals, int dim)
+{
+  // FIXME: implement a nice algo to assign regions based on the values!
+  double avg = 0.;
+  for(int i = 0; i < nbcomp*nbnod; i++)
+    avg += vals[i];
+  avg /= (double)(nbcomp*nbnod);
+  int ele = (int)fabs(avg) + 1, phys = 1;
+
+  switch(dim){
+  case 0:
+    fprintf(file, "%d 15 %d %d 1 %d\n", num, phys, ele, nod[0].Num);
+    break;
+  case 1:
+    fprintf(file, "%d 1 %d %d 2 %d %d\n", num, phys, ele, nod[0].Num, nod[1].Num);
+    break;
+  case 2:
+    if(nbnod == 3)
+      fprintf(file, "%d 2 %d %d 3 %d %d %d\n", num, phys, ele, 
+	      nod[0].Num, nod[1].Num, nod[2].Num);
+    else
+      fprintf(file, "%d 3 %d %d 4 %d %d %d %d\n", num, phys, ele, 
+	      nod[0].Num, nod[1].Num, nod[2].Num, nod[3].Num);
+    break;
+  case 3:
+  default:
+    if(nbnod == 4)
+      fprintf(file, "%d 4 %d %d 4 %d %d %d %d\n", num, phys, ele, 
+	      nod[0].Num, nod[1].Num, nod[2].Num, nod[3].Num);
+    else if(nbnod == 5)
+      fprintf(file, "%d 7 %d %d 5 %d %d %d %d %d\n", num, phys, ele, 
+	      nod[0].Num, nod[1].Num, nod[2].Num, nod[3].Num, nod[4].Num);
+    else if(nbnod == 6)
+      fprintf(file, "%d 6 %d %d 6 %d %d %d %d %d %d\n", num, phys, ele, 
+	      nod[0].Num, nod[1].Num, nod[2].Num, nod[3].Num, nod[4].Num, 
+	      nod[5].Num);
+    else
+      fprintf(file, "%d 5 %d %d 8 %d %d %d %d %d %d %d %d\n", num, phys, ele, 
+	      nod[0].Num, nod[1].Num, nod[2].Num, nod[3].Num, nod[4].Num, 
+	      nod[5].Num, nod[6].Num, nod[7].Num);
+    break;
+  }
+}
+
+static void print_elms(FILE *file, int nbelm, List_T *list,
+		       int nbnod, int nbcomp, int dim, 
+		       std::set<Nod, NodCompPos> *nodes,
+		       int *numelm)
+{
+  Nod nod[8];
+
+  if(nbelm){
+    int nb = List_Nbr(list) / nbelm;
+    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 *v = (double *)List_Pointer_Fast(list, i + 3 * nbnod);
+      for(int j = 0; j < nbnod; j++) {
+	Nod n(x[j], y[j], z[j]);
+	std::set<Nod, NodCompPos>::iterator it = nodes->find(n);
+	if(it == nodes->end()){
+	  Msg(GERROR, "Unknown node in element");
+	  break;
+	}
+	else{
+	  nod[j] = (Nod)(*it);
+	}
+      }
+      (*numelm)++;
+      print_elm(file, *numelm, nbnod, nod, nbcomp, v, dim);
+    }
+  }
+}
+
+void WriteViewMSH(Post_View *v, FILE *file)
+{
+  std::set<Nod, NodCompPos> nodes;
+  int numelm = 0;
+  get_nod(v->NbSP, v->SP, 1, 1, &nodes, &numelm);
+  get_nod(v->NbVP, v->VP, 1, 3, &nodes, &numelm);
+  get_nod(v->NbTP, v->TP, 1, 9, &nodes, &numelm);
+  get_nod(v->NbSL, v->SL, 2, 1, &nodes, &numelm);
+  get_nod(v->NbVL, v->VL, 2, 3, &nodes, &numelm);
+  get_nod(v->NbTL, v->TL, 2, 9, &nodes, &numelm);
+  get_nod(v->NbST, v->ST, 3, 1, &nodes, &numelm);
+  get_nod(v->NbVT, v->VT, 3, 3, &nodes, &numelm);
+  get_nod(v->NbTT, v->TT, 3, 9, &nodes, &numelm);
+  get_nod(v->NbSQ, v->SQ, 4, 1, &nodes, &numelm);
+  get_nod(v->NbVQ, v->VQ, 4, 3, &nodes, &numelm);
+  get_nod(v->NbTQ, v->TQ, 4, 9, &nodes, &numelm);
+  get_nod(v->NbSS, v->SS, 4, 1, &nodes, &numelm);
+  get_nod(v->NbVS, v->VS, 4, 3, &nodes, &numelm);
+  get_nod(v->NbTS, v->TS, 4, 9, &nodes, &numelm);
+  get_nod(v->NbSH, v->SH, 8, 1, &nodes, &numelm);
+  get_nod(v->NbVH, v->VH, 8, 3, &nodes, &numelm);
+  get_nod(v->NbTH, v->TH, 8, 9, &nodes, &numelm);
+  get_nod(v->NbSI, v->SI, 6, 1, &nodes, &numelm);
+  get_nod(v->NbVI, v->VI, 6, 3, &nodes, &numelm);
+  get_nod(v->NbTI, v->TI, 6, 9, &nodes, &numelm);
+  get_nod(v->NbSY, v->SY, 5, 1, &nodes, &numelm);
+  get_nod(v->NbVY, v->VY, 5, 3, &nodes, &numelm);
+  get_nod(v->NbTY, v->TY, 5, 9, &nodes, &numelm);
+
+  fprintf(file, "$NOD\n");
+  fprintf(file, "%d\n", (int)nodes.size());
+  std::set<Nod, NodCompPos>::const_iterator it = nodes.begin();
+  std::set<Nod, NodCompPos>::const_iterator ite = nodes.end();
+  for(; it != ite; ++it){
+    Nod n = (Nod)(*it);
+    fprintf(file, "%d %.16g %.16g %.16g\n", n.Num, n.X, n.Y, n.Z);
+  }
+  fprintf(file, "$ENDNOD\n");
+
+  fprintf(file, "$ELM\n");
+  fprintf(file, "%d\n", numelm);
+  numelm = 0;
+  print_elms(file, v->NbSP, v->SP, 1, 1, 0, &nodes, &numelm);
+  print_elms(file, v->NbVP, v->VP, 1, 3, 0, &nodes, &numelm);
+  print_elms(file, v->NbTP, v->TP, 1, 9, 0, &nodes, &numelm);
+  print_elms(file, v->NbSL, v->SL, 2, 1, 1, &nodes, &numelm);
+  print_elms(file, v->NbVL, v->VL, 2, 3, 1, &nodes, &numelm);
+  print_elms(file, v->NbTL, v->TL, 2, 9, 1, &nodes, &numelm);
+  print_elms(file, v->NbST, v->ST, 3, 1, 2, &nodes, &numelm);
+  print_elms(file, v->NbVT, v->VT, 3, 3, 2, &nodes, &numelm);
+  print_elms(file, v->NbTT, v->TT, 3, 9, 2, &nodes, &numelm);
+  print_elms(file, v->NbSQ, v->SQ, 4, 1, 2, &nodes, &numelm);
+  print_elms(file, v->NbVQ, v->VQ, 4, 3, 2, &nodes, &numelm);
+  print_elms(file, v->NbTQ, v->TQ, 4, 9, 2, &nodes, &numelm);
+  print_elms(file, v->NbSS, v->SS, 4, 1, 3, &nodes, &numelm);
+  print_elms(file, v->NbVS, v->VS, 4, 3, 3, &nodes, &numelm);
+  print_elms(file, v->NbTS, v->TS, 4, 9, 3, &nodes, &numelm);
+  print_elms(file, v->NbSH, v->SH, 8, 1, 3, &nodes, &numelm);
+  print_elms(file, v->NbVH, v->VH, 8, 3, 3, &nodes, &numelm);
+  print_elms(file, v->NbTH, v->TH, 8, 9, 3, &nodes, &numelm);
+  print_elms(file, v->NbSI, v->SI, 6, 1, 3, &nodes, &numelm);
+  print_elms(file, v->NbVI, v->VI, 6, 3, 3, &nodes, &numelm);
+  print_elms(file, v->NbTI, v->TI, 6, 9, 3, &nodes, &numelm);
+  print_elms(file, v->NbSY, v->SY, 5, 1, 3, &nodes, &numelm);
+  print_elms(file, v->NbVY, v->VY, 5, 3, 3, &nodes, &numelm);
+  print_elms(file, v->NbTY, v->TY, 5, 9, 3, &nodes, &numelm);
+  fprintf(file, "$ENDELM\n");
+}
+
+// Write view to file
+
+void WriteView(Post_View *v, char *filename, int format, int append)
+{
+  FILE *file;
+  int binary = (format == 1) ? 1 : 0;
+  int parsed = (format == 2);
+  int stl = (format == 3);
+  int txt = (format == 4);
+  int msh = (format == 5);
+
+  if(filename) {
+    file = fopen(filename, append ? (binary ? "ab" : "a") : (binary ? "wb" : "w"));
+    if(!file) {
+      Msg(GERROR, "Unable to open file '%s'", filename);
+      return;
+    }
+    if(!append)
+      Msg(INFO, "Writing post-processing file '%s'", filename);
+  }
+  else
+    file = stdout;
+
+  if(stl)
+    WriteViewSTL(v, file);
+  else if(txt)
+    WriteViewTXT(v, file);
+  else if(msh)
+    WriteViewMSH(v, file);
+  else
+    WriteViewPost(v, file, binary, parsed, append);
+  
+  if(filename) {
+    fclose(file);
+    Msg(INFO, "Wrote view '%s' in file '%s'", v->Name, filename);
+    Msg(STATUS2N, "Wrote '%s'", filename);
+  }
+ 
+}
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 2d4bb84423229ec794ab4f8d1bcd9c52ba4b52af..b82f602f4de0807a962ae0a20e2de4f08cd76644 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.403 2006-01-26 13:41:44 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.404 2006-01-27 21:15:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -3436,6 +3436,11 @@ void view_save_txt_cb(CALLBACK_ARGS)
   _view_save_as((int)(long)data, "Save As Text", 4);
 }
 
+void view_save_msh_cb(CALLBACK_ARGS)
+{
+  _view_save_as((int)(long)data, "Save As Mesh", 5);
+}
+
 void view_alias_cb(CALLBACK_ARGS)
 {
   AliasView((int)(long)data, 0);
@@ -3487,7 +3492,9 @@ void view_combine_time_by_name_cb(CALLBACK_ARGS)
 void view_all_visible_cb(CALLBACK_ARGS)
 {
   for(int i = 0; i < List_Nbr(CTX.post.list); i ++)
-    opt_view_visible(i, GMSH_SET | GMSH_GUI, (long)data ? 1 : 0);
+    opt_view_visible(i, GMSH_SET | GMSH_GUI, 
+		     (long)data < 0 ? !opt_view_visible(i, GMSH_GET, 0) :
+		     (long)data > 0 ? 1 : 0);
   Draw();
 }
 
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index 695cae000f2738cfc1856f67cc75a63be6ad1d06..d0a1092ae8a578c6e4f93fe74f478a15aaf248dc 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -118,6 +118,7 @@ void view_save_binary_cb(CALLBACK_ARGS);
 void view_save_parsed_cb(CALLBACK_ARGS);
 void view_save_stl_cb(CALLBACK_ARGS);
 void view_save_txt_cb(CALLBACK_ARGS);
+void view_save_msh_cb(CALLBACK_ARGS);
 void view_alias_cb(CALLBACK_ARGS);
 void view_alias_with_options_cb(CALLBACK_ARGS);
 void view_combine_space_all_cb(CALLBACK_ARGS);
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 614b87a9e7b487ff708a7d04dd66f5baaf7f2216..4c4ee5ceedaa05e5a2f292a11d6caee57f06eb0c 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.483 2006-01-26 13:41:45 geuzaine Exp $
+// $Id: GUI.cpp,v 1.484 2006-01-27 21:15:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -1263,6 +1263,8 @@ void GUI::set_context(Context_Item * menu_asked, int flag)
 		  (Fl_Callback *) view_all_visible_cb, (void *)1, 0);
 	p[j]->add("Set Visibility/All Off", 0, 
 		  (Fl_Callback *) view_all_visible_cb, (void *)0, 0);
+	p[j]->add("Set Visibility/Invert", 0, 
+		  (Fl_Callback *) view_all_visible_cb, (void *)-1, 0);
 	p[j]->add("Save As/Parsed View...", 0, 
 		  (Fl_Callback *) view_save_parsed_cb, (void *)nb, 0);
 	p[j]->add("Save As/ASCII View...", 0, 
@@ -1273,6 +1275,8 @@ void GUI::set_context(Context_Item * menu_asked, int flag)
 		  (Fl_Callback *) view_save_stl_cb, (void *)nb, 0);
 	p[j]->add("Save As/Text...", 0, 
 		  (Fl_Callback *) view_save_txt_cb, (void *)nb, 0);
+	p[j]->add("Save As/Mesh...", 0, 
+		  (Fl_Callback *) view_save_msh_cb, (void *)nb, 0);
 	add_post_plugins(p[j], nb);
 	p[j]->add("Apply As Background Mesh", 0, 
 		  (Fl_Callback *) view_applybgmesh_cb, (void *)nb, FL_MENU_DIVIDER);
diff --git a/TODO b/TODO
index 9939b02d4beb669aceb7fb26d752cd5dbdbf100e..4c5d21443d8867dc9f7e7df1584f73721c356521 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-$Id: TODO,v 1.119 2006-01-26 13:41:44 geuzaine Exp $
+$Id: TODO,v 1.120 2006-01-27 21:15:30 geuzaine Exp $
 
 ********************************************************************
 
@@ -19,11 +19,6 @@ curve/surface/volume or loop over all elements.)
 
 ********************************************************************
 
-Would be nice to have a routine to save a post-processing view as a
-mesh file (in MSH format)
-
-********************************************************************
-
 On Windows WITHOUT Cygwin:
 - rewrite solver interface (GmshServer and GmshClient)
 - Functions in parser don't seem to work
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 4bb869623c5b82b493ad3c1ef44b7f4480d41cd8..d0521286ce0f17c608312a69e333a4d5816d4505 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,4 +1,7 @@
-$Id: VERSIONS,v 1.353 2006-01-15 17:42:48 geuzaine Exp $
+$Id: VERSIONS,v 1.354 2006-01-27 21:15:31 geuzaine Exp $
+
+New since 1.62: post-processing views can now also be exported as 
+meshes; small bug fixes.
 
 New in 1.62: new option to draw color gradients in the background;
 enhanced perspective projection mode; new "lasso" selection mode (same
diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi
index b40dd0baacfd2f211b8c9f4d793e452408e72e5a..5d701926c9f7e54bfc35322b804029fc9a9981ed 100644
--- a/doc/texinfo/opt_mesh.texi
+++ b/doc/texinfo/opt_mesh.texi
@@ -231,7 +231,7 @@ Saved in: @code{General.OptionsFileName}
 
 @item Mesh.Points
 Display mesh vertices (nodes)?@*
-Default value: @code{1}@*
+Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}
 
 @item Mesh.PointsPerElement
diff --git a/doc/texinfo/opt_post.texi b/doc/texinfo/opt_post.texi
index c8da00db9c98378502b9774635d19f1afc815b9d..efc3e8cb905713273bb2d9439d824386adb75e5f 100644
--- a/doc/texinfo/opt_post.texi
+++ b/doc/texinfo/opt_post.texi
@@ -20,7 +20,7 @@ Default value: @code{1}@*
 Saved in: @code{General.OptionsFileName}
 
 @item PostProcessing.Format
-Default file format for post-processing views (0=ASCII view, 1=binary view, 2=parsed view, 3=STL triangulation, 4=text)@*
+Default file format for post-processing views (0=ASCII view, 1=binary view, 2=parsed view, 3=STL triangulation, 4=text, 5=mesh)@*
 Default value: @code{0}@*
 Saved in: @code{General.OptionsFileName}