diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index 9f43a21f000dc0999d0903444b761ef71e387672..e556d48bdb394ddb23e59fe09577c67f555fb328 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.166 2005-01-13 05:45:46 geuzaine Exp $
+@c $Id: gmsh.texi,v 1.167 2005-01-14 17:54:01 geuzaine Exp $
 @c
 @c Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 @c
@@ -2210,24 +2210,24 @@ available on @value{GMSH-WEB}.
 @cindex Solver example
 @cindex Example, solver
 
-Here is a small example of how to interface a C solver with Gmsh. The
-following listing reproduces the @file{utils/solvers/mysolver.c} file from
-the Gmsh source distribution.
+Here is a small example of how to interface a C++ solver with Gmsh. The
+following listing reproduces the @file{utils/solvers/c++/solver.cpp} file
+from the Gmsh source distribution (C and Perl examples are also available).
 
 @sp 1
 
-@verbatiminclude ../../utils/solvers/mysolver.c
+@verbatiminclude ../../utils/solvers/c++/solver.cpp
 
 @sp 1
 
-To define the above solver as the second external solver in Gmsh, you should
-define the following solver options (either merge them in your Gmsh option
+To define the above solver as the second external solver in Gmsh, you then
+need to define the following options (either merge them in your Gmsh option
 file, or use the @code{-option} command-line option---see @ref{Command-line
 options}):
 
 @sp 1
 
-@verbatiminclude ../../utils/solvers/mysolver.opt
+@verbatiminclude ../../utils/solvers/c++/solver.opt
 
 @c =========================================================================
 @c Post-processing module
@@ -2322,6 +2322,10 @@ different display options), but you cannot afford to store all copies in
 memory. If what you really want is multiple physical copies of the data,
 just merge the file containing the post-processing view multiple times.
 
+@item AliasWithOptions View[@var{expression}];
+Creates an alias of the @var{expression}-th post-processing view and copies
+all the options of the @var{expression}-th view to the new aliased view.
+
 @item Combine TimeSteps;
 Combines the data from all the post-processing views having the same name
 into new multi-time-step views.
diff --git a/utils/solvers/c++/Makefile b/utils/solvers/c++/Makefile
index aa1b85424afd7532f20a0b6364a7d9fb6a8d430d..4d609025304925ab47c851e32517c8b10a2176e3 100644
--- a/utils/solvers/c++/Makefile
+++ b/utils/solvers/c++/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.2 2005-01-14 02:27:01 geuzaine Exp $
+# $Id: Makefile,v 1.3 2005-01-14 17:54:01 geuzaine Exp $
 #
 # Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 #
@@ -21,8 +21,8 @@
 
 include ../../../variables
 
-andre: andre.cpp
-	${CXX} ${FLAGS} ${OPTIM} -o andre.exe andre.cpp
+solver: solver.cpp
+	${CXX} ${FLAGS} ${OPTIM} -o solver.exe solver.cpp
 
 clean:
 	rm -f *.o *.exe *.pos
diff --git a/utils/solvers/c++/andre.cpp b/utils/solvers/c++/andre.cpp
deleted file mode 100644
index 8ab24cc41476ae925c0ab79d80f354addc82e998..0000000000000000000000000000000000000000
--- a/utils/solvers/c++/andre.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <math.h>
-#include "GmshClient.h"
-
-typedef enum { send_options, run_code } action;
-
-int main(int argc, char *argv[])
-{
-  action what_to_do = run_code;
-  char *name = NULL, *option = NULL, *socket = NULL;
-
-  // parse command line
-
-  int i = 0;
-  while(i < argc) {
-    if(argv[i][0] == '-') {
-      if(!strcmp(argv[i] + 1, "socket")) {
-        i++; 
-	if(argv[i]) socket = argv[i++];
-      }
-      else if(!strcmp(argv[i] + 1, "options")) {
-        i++;
-        what_to_do = send_options;
-      }
-      else if(!strcmp(argv[i] + 1, "run")) {
-        i++;
-        what_to_do = run_code;
-        if(argv[i]) option = argv[i++];
-      }
-    }
-    else
-      name = argv[i++];
-  }
-
-  if(!socket) {
-    printf("No socket specified: running non-interactively...\n");
-    exit(1);
-  }
-
-  // connect to Gmsh
-
-  GmshClient client;
-  if(client.Connect(socket) < 0){
-    printf("Unable to connect to server\n");
-    exit(1);
-  }
-  else{
-    client.Start(getpid());
-    if(what_to_do == send_options) {
-      // send the available options for this computation
-      client.Option(1, "FormulationH");
-      client.Option(1, "\"Convergence Test\"");
-      client.Option(1, "\"Blabla blblablabli\"");
-    }
-    else if(what_to_do == run_code){
-      // do the computation and merge some views
-      for(int i = 0; i < 10; i++){
-	client.Info("Computing curve...");
-	sleep(1);
-	client.Info("Done computing curve");
-	FILE *file = fopen("andre.pos", "w");
-	if(!file)
-	  client.Error("Unable to open output file");
-	else {
-	  fprintf(file, "General.GraphicsWidth = 500;\n");
-	  fprintf(file, "General.GraphicsHeight = 450;\n");
-	  fprintf(file, "General.SmallAxes = 0;\n");
-	  fprintf(file, "View.Type = 2;\n");
-	  fprintf(file, "View.AutoPosition = 0;\n");
-	  fprintf(file, "View.PositionX = 100;\n");
-	  fprintf(file, "View.PositionY = 50;\n");
-	  fprintf(file, "View.Width = 350;\n");
-	  fprintf(file, "View.Height = 350;\n");
-	  fprintf(file, "Delete View[0];\n");
-	  fprintf(file, "View \"test\"{\n");
-	  for(int j = 0; j < 100; j++)
-	    fprintf(file, "SP(%d,0,0){%g};\n", j,sin(j*i*M_PI/10.));
-	  fprintf(file, "};\n");
-	  fclose(file);
-	  client.View("andre.pos");
-	}
-      }
-      client.Info("Done!");
-    }
-
-    client.Stop();
-    client.Disconnect();
-  }
-}
diff --git a/utils/solvers/c++/solver.cpp b/utils/solvers/c++/solver.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5d61838f22531444aa126d3e69fcf33835c92f8d
--- /dev/null
+++ b/utils/solvers/c++/solver.cpp
@@ -0,0 +1,93 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "GmshClient.h"
+
+typedef enum { send_options, run_code } action;
+
+int main(int argc, char *argv[])
+{
+  action what_to_do = run_code;
+  char *name = NULL, *option = NULL, *socket = NULL;
+
+  // parse command line
+
+  int i = 0;
+  while(i < argc) {
+    if(argv[i][0] == '-') {
+      if(!strcmp(argv[i] + 1, "socket")) {
+        i++; 
+	if(argv[i]) socket = argv[i++];
+      }
+      else if(!strcmp(argv[i] + 1, "options")) {
+        i++;
+        what_to_do = send_options;
+      }
+      else if(!strcmp(argv[i] + 1, "run")) {
+        i++;
+        what_to_do = run_code;
+        if(argv[i]) option = argv[i++];
+      }
+    }
+    else
+      name = argv[i++];
+  }
+
+  if(!socket) {
+    printf("No socket specified: running non-interactively...\n");
+    exit(1);
+  }
+
+  // connect to Gmsh
+
+  GmshClient client;
+  if(client.Connect(socket) < 0){
+    printf("Unable to connect to Gmsh\n");
+    exit(1);
+  }
+
+  client.Start(getpid());
+
+  if(what_to_do == send_options) {
+    // send the available options for this computation
+    client.Option(1, "FormulationH");
+    client.Option(1, "ConvTest");
+    client.Option(1, "Blablabli");
+  }
+  else if(what_to_do == run_code){
+    // do the computation and merge some views
+    for(int i = 0; i < 10; i++){
+      client.Info("Computing curve...");
+      sleep(1); // fake computation...
+      client.Info("Done computing curve");
+      FILE *file = fopen("solver.pos", "w");
+      if(!file)
+	client.Error("Unable to open output file");
+      else {
+	fprintf(file, "General.GraphicsWidth = 500;\n");
+	fprintf(file, "General.GraphicsHeight = 450;\n");
+	fprintf(file, "General.SmallAxes = 0;\n");
+	fprintf(file, "View.Type = 2;\n");
+	fprintf(file, "View.AutoPosition = 0;\n");
+	fprintf(file, "View.PositionX = 100;\n");
+	fprintf(file, "View.PositionY = 50;\n");
+	fprintf(file, "View.Width = 350;\n");
+	fprintf(file, "View.Height = 350;\n");
+	fprintf(file, "Delete View[0];\n");
+	fprintf(file, "View \"%s\"{\n", option);
+	for(int j = 0; j < 100; j++)
+	  fprintf(file, "SP(%d,0,0){%g};\n", j,sin(j*i*M_PI/10.));
+	fprintf(file, "};\n");
+	fclose(file);
+	client.View("solver.pos");
+      }
+    }
+    client.Info("Done!");
+  }
+
+  client.Stop();
+  client.Disconnect();
+}
diff --git a/utils/solvers/c++/andre.opt b/utils/solvers/c++/solver.opt
similarity index 56%
rename from utils/solvers/c++/andre.opt
rename to utils/solvers/c++/solver.opt
index 399b6b8eea5850322de7617af61b79723169e596..c8e38486d211faf6b2481983bae6811e4cadd702 100644
--- a/utils/solvers/c++/andre.opt
+++ b/utils/solvers/c++/solver.opt
@@ -1,8 +1,7 @@
-Solver.Name1 = "Solveur Andre";
-Solver.Help1 = "Mon petit solveur";
-Solver.Executable1 = "./andre.exe";
+Solver.Name1 = "My C++ Solver";
+Solver.Executable1 = "./solver.exe";
 Solver.OptionCommand1 = "-options";
-Solver.FirstOption1 = "Mes options";
+Solver.FirstOption1 = "My options";
 Solver.FirstButton1 = "Run !";
 Solver.FirstButtonCommand1 = "-run %s";
 Solver.ClientServer1 = 1;