diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index e1f0ddf2993d5fd83945a655acfecadbe079c48a..7ca7271c420eab59e5a46a6cf1dae5905b872866 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -119,6 +119,10 @@ StringXString SolverOptions_String[] = {
     "Default mesh file name for solver 0" },
   { F|O, "MeshCommand0" , opt_solver_mesh_command0 , "-msh %s" ,
     "Command used to specify the mesh file for solver 0" },
+  { F|O, "SocketCommand0", opt_solver_socket_command0, "-socket %s",
+    "Command to specify the socket to solver 0" },
+  { F|O, "NameCommand0", opt_solver_name_command0, "%s",
+    "Command to specify the problem name to solver 0" },
   { F|O, "OptionCommand0" , opt_solver_option_command0 , "" ,
     "Command to get options from solver 0" },
   { F|O, "FirstOption0" , opt_solver_first_option0 , "Resolution" ,
@@ -164,6 +168,10 @@ StringXString SolverOptions_String[] = {
     "Default mesh file name for solver 1" },
   { F|O, "MeshCommand1" , opt_solver_mesh_command1 , "" ,
     "Command used to specify the mesh file for solver 1" },
+  { F|O, "SocketCommand1", opt_solver_socket_command1, "-socket %s",
+    "Command to specify the socket to solver 1" },
+  { F|O, "NameCommand1", opt_solver_name_command1, "%s",
+    "Command to specify the problem name to solver 1" },
   { F|O, "OptionCommand1" , opt_solver_option_command1 , "" ,
     "Command to get options from solver 1" },
   { F|O, "FirstOption1" , opt_solver_first_option1 , "" ,
@@ -209,6 +217,10 @@ StringXString SolverOptions_String[] = {
     "Default mesh file name for solver 2" },
   { F|O, "MeshCommand2" , opt_solver_mesh_command2 , "" ,
     "Command used to specify the mesh file for solver 2" },
+  { F|O, "SocketCommand2", opt_solver_socket_command2, "-socket %s",
+    "Command to specify the socket to solver 2" },
+  { F|O, "NameCommand2", opt_solver_name_command2, "%s",
+    "Command to specify the problem name to solver 2" },
   { F|O, "OptionCommand2" , opt_solver_option_command2 , "" ,
     "Command to get options from solver 2" },
   { F|O, "FirstOption2" , opt_solver_first_option2 , "" ,
@@ -254,6 +266,10 @@ StringXString SolverOptions_String[] = {
     "Default mesh file name for solver 3" },
   { F|O, "MeshCommand3" , opt_solver_mesh_command3 , "" ,
     "Command used to specify the mesh file for solver 3" },
+  { F|O, "SocketCommand3", opt_solver_socket_command3, "-socket %s",
+    "Command to specify the socket to solver 3" },
+  { F|O, "NameCommand3", opt_solver_name_command3, "%s",
+    "Command to specify the problem name to solver 3" },
   { F|O, "OptionCommand3" , opt_solver_option_command3 , "" ,
     "Command to get options from solver 3" },
   { F|O, "FirstOption3" , opt_solver_first_option3 , "" ,
@@ -299,6 +315,10 @@ StringXString SolverOptions_String[] = {
     "Default mesh file name for solver 4" },
   { F|O, "MeshCommand4" , opt_solver_mesh_command4 , "" ,
     "Command used to specify the mesh file for solver 4" },
+  { F|O, "SocketCommand4", opt_solver_socket_command4, "-socket %s",
+    "Command to specify the socket to solver 4" },
+  { F|O, "NameCommand4", opt_solver_name_command1, "%s",
+    "Command to specify the problem name to solver 4" },
   { F|O, "OptionCommand4" , opt_solver_option_command4 , "" ,
     "Command to get options from solver 4" },
   { F|O, "FirstOption4" , opt_solver_first_option4 , "" ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index e8422d65144afb689d11aafad3ebd3fc37f0d097..bfff11196e26188c263f7635341b1064ee66fa12 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.192 2004-10-21 17:02:25 geuzaine Exp $
+// $Id: Options.cpp,v 1.193 2004-10-25 00:45:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1143,6 +1143,78 @@ char *opt_solver_mesh_command4(OPT_ARGS_STR)
   return opt_solver_mesh_command(4, action, val);
 }
 
+char *opt_solver_socket_command(OPT_ARGS_STR)
+{
+#if defined(HAVE_FLTK)
+  if(action & GMSH_SET)
+    strcpy(SINFO[num].socket_command, val);
+  return SINFO[num].socket_command;
+#else
+  return "undefined";
+#endif
+}
+
+char *opt_solver_socket_command0(OPT_ARGS_STR)
+{
+  return opt_solver_socket_command(0, action, val);
+}
+
+char *opt_solver_socket_command1(OPT_ARGS_STR)
+{
+  return opt_solver_socket_command(1, action, val);
+}
+
+char *opt_solver_socket_command2(OPT_ARGS_STR)
+{
+  return opt_solver_socket_command(2, action, val);
+}
+
+char *opt_solver_socket_command3(OPT_ARGS_STR)
+{
+  return opt_solver_socket_command(3, action, val);
+}
+
+char *opt_solver_socket_command4(OPT_ARGS_STR)
+{
+  return opt_solver_socket_command(4, action, val);
+}
+
+char *opt_solver_name_command(OPT_ARGS_STR)
+{
+#if defined(HAVE_FLTK)
+  if(action & GMSH_SET)
+    strcpy(SINFO[num].name_command, val);
+  return SINFO[num].name_command;
+#else
+  return "undefined";
+#endif
+}
+
+char *opt_solver_name_command0(OPT_ARGS_STR)
+{
+  return opt_solver_name_command(0, action, val);
+}
+
+char *opt_solver_name_command1(OPT_ARGS_STR)
+{
+  return opt_solver_name_command(1, action, val);
+}
+
+char *opt_solver_name_command2(OPT_ARGS_STR)
+{
+  return opt_solver_name_command(2, action, val);
+}
+
+char *opt_solver_name_command3(OPT_ARGS_STR)
+{
+  return opt_solver_name_command(3, action, val);
+}
+
+char *opt_solver_name_command4(OPT_ARGS_STR)
+{
+  return opt_solver_name_command(4, action, val);
+}
+
 char *opt_solver_option_command(OPT_ARGS_STR)
 {
 #if defined(HAVE_FLTK)
@@ -5335,6 +5407,7 @@ unsigned int opt_general_color_background(OPT_ARGS_COL)
 #endif
   return CTX.color.bg;
 }
+
 unsigned int opt_general_color_foreground(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5344,6 +5417,7 @@ unsigned int opt_general_color_foreground(OPT_ARGS_COL)
 #endif
   return CTX.color.fg;
 }
+
 unsigned int opt_general_color_text(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5353,6 +5427,7 @@ unsigned int opt_general_color_text(OPT_ARGS_COL)
 #endif
   return CTX.color.text;
 }
+
 unsigned int opt_general_color_axes(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5362,6 +5437,7 @@ unsigned int opt_general_color_axes(OPT_ARGS_COL)
 #endif
   return CTX.color.axes;
 }
+
 unsigned int opt_general_color_small_axes(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5371,6 +5447,7 @@ unsigned int opt_general_color_small_axes(OPT_ARGS_COL)
 #endif
   return CTX.color.small_axes;
 }
+
 unsigned int opt_general_color_ambient_light(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5381,6 +5458,7 @@ unsigned int opt_general_color_ambient_light(OPT_ARGS_COL)
 #endif
   return CTX.color.ambient_light[0];
 }
+
 unsigned int opt_general_color_diffuse_light(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5391,6 +5469,7 @@ unsigned int opt_general_color_diffuse_light(OPT_ARGS_COL)
 #endif
   return CTX.color.diffuse_light[0];
 }
+
 unsigned int opt_general_color_specular_light(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5401,6 +5480,7 @@ unsigned int opt_general_color_specular_light(OPT_ARGS_COL)
 #endif
   return CTX.color.specular_light[0];
 }
+
 unsigned int opt_geometry_color_points(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5410,6 +5490,7 @@ unsigned int opt_geometry_color_points(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.point;
 }
+
 unsigned int opt_geometry_color_lines(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5419,6 +5500,7 @@ unsigned int opt_geometry_color_lines(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.line;
 }
+
 unsigned int opt_geometry_color_surfaces(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5428,6 +5510,7 @@ unsigned int opt_geometry_color_surfaces(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.surface;
 }
+
 unsigned int opt_geometry_color_volumes(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5437,6 +5520,7 @@ unsigned int opt_geometry_color_volumes(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.volume;
 }
+
 unsigned int opt_geometry_color_points_select(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5446,6 +5530,7 @@ unsigned int opt_geometry_color_points_select(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.point_sel;
 }
+
 unsigned int opt_geometry_color_lines_select(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5455,6 +5540,7 @@ unsigned int opt_geometry_color_lines_select(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.line_sel;
 }
+
 unsigned int opt_geometry_color_surfaces_select(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5464,6 +5550,7 @@ unsigned int opt_geometry_color_surfaces_select(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.surface_sel;
 }
+
 unsigned int opt_geometry_color_volumes_select(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5473,6 +5560,7 @@ unsigned int opt_geometry_color_volumes_select(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.volume_sel;
 }
+
 unsigned int opt_geometry_color_tangents(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5482,6 +5570,7 @@ unsigned int opt_geometry_color_tangents(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.tangents;
 }
+
 unsigned int opt_geometry_color_normals(OPT_ARGS_COL)
 {
   if(action & GMSH_SET)
@@ -5491,6 +5580,7 @@ unsigned int opt_geometry_color_normals(OPT_ARGS_COL)
 #endif
   return CTX.color.geom.normals;
 }
+
 unsigned int opt_mesh_color_points(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5501,6 +5591,7 @@ unsigned int opt_mesh_color_points(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.vertex;
 }
+
 unsigned int opt_mesh_color_points_deg2(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5511,6 +5602,7 @@ unsigned int opt_mesh_color_points_deg2(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.vertex_deg2;
 }
+
 unsigned int opt_mesh_color_lines(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5521,6 +5613,7 @@ unsigned int opt_mesh_color_lines(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.line;
 }
+
 unsigned int opt_mesh_color_triangles(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5532,6 +5625,7 @@ unsigned int opt_mesh_color_triangles(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.triangle;
 }
+
 unsigned int opt_mesh_color_quadrangles(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5543,6 +5637,7 @@ unsigned int opt_mesh_color_quadrangles(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.quadrangle;
 }
+
 unsigned int opt_mesh_color_tetrahedra(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5554,6 +5649,7 @@ unsigned int opt_mesh_color_tetrahedra(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.tetrahedron;
 }
+
 unsigned int opt_mesh_color_hexahedra(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5565,6 +5661,7 @@ unsigned int opt_mesh_color_hexahedra(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.hexahedron;
 }
+
 unsigned int opt_mesh_color_prisms(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5576,6 +5673,7 @@ unsigned int opt_mesh_color_prisms(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.prism;
 }
+
 unsigned int opt_mesh_color_pyramid(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5587,6 +5685,7 @@ unsigned int opt_mesh_color_pyramid(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.pyramid;
 }
+
 unsigned int opt_mesh_color_tangents(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5597,6 +5696,7 @@ unsigned int opt_mesh_color_tangents(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.tangents;
 }
+
 unsigned int opt_mesh_color_normals(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5607,6 +5707,7 @@ unsigned int opt_mesh_color_normals(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.normals;
 }
+
 unsigned int opt_mesh_color_1(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5618,6 +5719,7 @@ unsigned int opt_mesh_color_1(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[0];
 }
+
 unsigned int opt_mesh_color_2(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5629,6 +5731,7 @@ unsigned int opt_mesh_color_2(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[1];
 }
+
 unsigned int opt_mesh_color_3(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5640,6 +5743,7 @@ unsigned int opt_mesh_color_3(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[2];
 }
+
 unsigned int opt_mesh_color_4(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5651,6 +5755,7 @@ unsigned int opt_mesh_color_4(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[3];
 }
+
 unsigned int opt_mesh_color_5(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5662,6 +5767,7 @@ unsigned int opt_mesh_color_5(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[4];
 }
+
 unsigned int opt_mesh_color_6(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5673,6 +5779,7 @@ unsigned int opt_mesh_color_6(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[5];
 }
+
 unsigned int opt_mesh_color_7(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5684,6 +5791,7 @@ unsigned int opt_mesh_color_7(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[6];
 }
+
 unsigned int opt_mesh_color_8(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5695,6 +5803,7 @@ unsigned int opt_mesh_color_8(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[7];
 }
+
 unsigned int opt_mesh_color_9(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
@@ -5706,6 +5815,7 @@ unsigned int opt_mesh_color_9(OPT_ARGS_COL)
 #endif
   return CTX.color.mesh.carousel[8];
 }
+
 unsigned int opt_mesh_color_10(OPT_ARGS_COL)
 {
   if(action & GMSH_SET) {
diff --git a/Common/Options.h b/Common/Options.h
index a2491f8314bc933f2072734f7ac3b5661e4e3f7c..f9feaf6a8812e7824ba5a95e933dd087ed4a8907 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -83,6 +83,18 @@ char * opt_solver_mesh_command1(OPT_ARGS_STR);
 char * opt_solver_mesh_command2(OPT_ARGS_STR);
 char * opt_solver_mesh_command3(OPT_ARGS_STR);
 char * opt_solver_mesh_command4(OPT_ARGS_STR);
+char * opt_solver_socket_command(OPT_ARGS_STR);
+char * opt_solver_socket_command0(OPT_ARGS_STR);
+char * opt_solver_socket_command1(OPT_ARGS_STR);
+char * opt_solver_socket_command2(OPT_ARGS_STR);
+char * opt_solver_socket_command3(OPT_ARGS_STR);
+char * opt_solver_socket_command4(OPT_ARGS_STR);
+char * opt_solver_name_command(OPT_ARGS_STR);
+char * opt_solver_name_command0(OPT_ARGS_STR);
+char * opt_solver_name_command1(OPT_ARGS_STR);
+char * opt_solver_name_command2(OPT_ARGS_STR);
+char * opt_solver_name_command3(OPT_ARGS_STR);
+char * opt_solver_name_command4(OPT_ARGS_STR);
 char * opt_solver_option_command(OPT_ARGS_STR);
 char * opt_solver_option_command0(OPT_ARGS_STR);
 char * opt_solver_option_command1(OPT_ARGS_STR);
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index d786bd4125a3760ef1e3fa05057c783429d927ea..2305a2fcd7e4dd2146e3f31ad4a3abd2e3e46eef 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.287 2004-10-21 17:02:25 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.288 2004-10-25 00:45:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -420,18 +420,22 @@ void _save_auto(char *name)
 {
   CreateOutputFile(name, FORMAT_AUTO);
 }
+
 void _save_geo_options(char *name)
 {
   CreateOutputFile(name, FORMAT_OPT);
 }
+
 void _save_geo_options_diff(char *name)
 {
   Print_Options(0, GMSH_FULLRC, true, name);
 }
+
 void _save_geo(char *name)
 {
   CreateOutputFile(name, FORMAT_GEO);
 }
+
 void _save_msh(char *name)
 {
   double ver = CTX.mesh.msh_file_version;
@@ -439,6 +443,7 @@ void _save_msh(char *name)
   CreateOutputFile(name, CTX.mesh.format = FORMAT_MSH);
   CTX.mesh.msh_file_version = ver;
 }
+
 void _save_msh_all(char *name)
 {
   int all = CTX.mesh.save_all;
@@ -449,6 +454,7 @@ void _save_msh_all(char *name)
   CTX.mesh.save_all = all;
   CTX.mesh.msh_file_version = ver;
 }
+
 void _save_msh_v2(char *name)
 {
   double ver = CTX.mesh.msh_file_version;
@@ -456,6 +462,7 @@ void _save_msh_v2(char *name)
   CreateOutputFile(name, CTX.mesh.format = FORMAT_MSH);
   CTX.mesh.msh_file_version = ver;
 }
+
 void _save_msh_all_v2(char *name)
 {
   int all = CTX.mesh.save_all;
@@ -466,30 +473,37 @@ void _save_msh_all_v2(char *name)
   CTX.mesh.save_all = all;
   CTX.mesh.msh_file_version = ver;
 }
+
 void _save_lc_sur(char *name)
 {
   CreateOutputFile(name, FORMAT_LC_SUR);
 }
+
 void _save_lc_vol(char *name)
 {
   CreateOutputFile(name, FORMAT_LC_VOL);
 }
+
 void _save_gref(char *name)
 {
   CreateOutputFile(name, CTX.mesh.format = FORMAT_GREF);
 }
+
 void _save_unv(char *name)
 {
   CreateOutputFile(name, CTX.mesh.format = FORMAT_UNV);
 }
+
 void _save_vrml(char *name)
 {
   CreateOutputFile(name, CTX.mesh.format = FORMAT_VRML);
 }
+
 void _save_ps_raster(char *name)
 {
   CreateOutputFile(name, FORMAT_PS_RASTER);
 }
+
 void _save_ps_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -497,6 +511,7 @@ void _save_ps_simple(char *name)
   CreateOutputFile(name, FORMAT_PS);
   CTX.print.eps_quality = old;
 }
+
 void _save_ps_accurate(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -504,10 +519,12 @@ void _save_ps_accurate(char *name)
   CreateOutputFile(name, FORMAT_PS);
   CTX.print.eps_quality = old;
 }
+
 void _save_eps_raster(char *name)
 {
   CreateOutputFile(name, FORMAT_EPS_RASTER);
 }
+
 void _save_eps_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -515,6 +532,7 @@ void _save_eps_simple(char *name)
   CreateOutputFile(name, FORMAT_EPS);
   CTX.print.eps_quality = old;
 }
+
 void _save_eps_accurate(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -522,10 +540,12 @@ void _save_eps_accurate(char *name)
   CreateOutputFile(name, FORMAT_EPS);
   CTX.print.eps_quality = old;
 }
+
 void _save_epstex_raster(char *name)
 {
   CreateOutputFile(name, FORMAT_EPSTEX_RASTER);
 }
+
 void _save_epstex_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -533,6 +553,7 @@ void _save_epstex_simple(char *name)
   CreateOutputFile(name, FORMAT_EPSTEX);
   CTX.print.eps_quality = old;
 }
+
 void _save_epstex_accurate(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -540,10 +561,12 @@ void _save_epstex_accurate(char *name)
   CreateOutputFile(name, FORMAT_EPSTEX);
   CTX.print.eps_quality = old;
 }
+
 void _save_pdf_raster(char *name)
 {
   CreateOutputFile(name, FORMAT_PDF_RASTER);
 }
+
 void _save_pdf_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -551,6 +574,7 @@ void _save_pdf_simple(char *name)
   CreateOutputFile(name, FORMAT_PDF);
   CTX.print.eps_quality = old;
 }
+
 void _save_pdf_accurate(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -558,10 +582,12 @@ void _save_pdf_accurate(char *name)
   CreateOutputFile(name, FORMAT_PDF);
   CTX.print.eps_quality = old;
 }
+
 void _save_pdftex_raster(char *name)
 {
   CreateOutputFile(name, FORMAT_PDFTEX_RASTER);
 }
+
 void _save_pdftex_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -569,6 +595,7 @@ void _save_pdftex_simple(char *name)
   CreateOutputFile(name, FORMAT_PDFTEX);
   CTX.print.eps_quality = old;
 }
+
 void _save_pdftex_accurate(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -576,26 +603,32 @@ void _save_pdftex_accurate(char *name)
   CreateOutputFile(name, FORMAT_PDFTEX);
   CTX.print.eps_quality = old;
 }
+
 void _save_jpegtex(char *name)
 {
   CreateOutputFile(name, FORMAT_JPEGTEX);
 }
+
 void _save_pngtex(char *name)
 {
   CreateOutputFile(name, FORMAT_PNGTEX);
 }
+
 void _save_tex(char *name)
 {
   CreateOutputFile(name, FORMAT_TEX);
 }
+
 void _save_jpeg(char *name)
 {
   CreateOutputFile(name, FORMAT_JPEG);
 }
+
 void _save_png(char *name)
 {
   CreateOutputFile(name, FORMAT_PNG);
 }
+
 void _save_gif(char *name)
 {
   int dither = CTX.print.gif_dither;
@@ -606,6 +639,7 @@ void _save_gif(char *name)
   CTX.print.gif_dither = dither;
   CTX.print.gif_transparent = transp;
 }
+
 void _save_gif_dithered(char *name)
 {
   int dither = CTX.print.gif_dither;
@@ -616,6 +650,7 @@ void _save_gif_dithered(char *name)
   CTX.print.gif_dither = dither;
   CTX.print.gif_transparent = transp;
 }
+
 void _save_gif_transparent(char *name)
 {
   int dither = CTX.print.gif_dither;
@@ -626,10 +661,12 @@ void _save_gif_transparent(char *name)
   CTX.print.gif_dither = dither;
   CTX.print.gif_transparent = transp;
 }
+
 void _save_ppm(char *name)
 {
   CreateOutputFile(name, FORMAT_PPM);
 }
+
 void _save_yuv(char *name)
 {
   CreateOutputFile(name, FORMAT_YUV);
@@ -2881,8 +2918,10 @@ void solver_cb(CALLBACK_ARGS)
   }
   if(SINFO[num].nboptions) {
     char file[1024];
-    FixWindowsPath((char *)WID->solver[num].input[0]->value(), file);
-    sprintf(tmp, "%s \"%s\"", SINFO[num].option_command, file);           
+    FixWindowsPath((char*)WID->solver[num].input[0]->value(), file);
+    sprintf(tmp, "\"%s\"", file);
+    sprintf(file, SINFO[num].name_command, tmp);
+    sprintf(tmp, "%s %s", SINFO[num].option_command, file);           
     Solver(num, tmp);
   }
   WID->create_solver_window(num);
@@ -2901,11 +2940,14 @@ void solver_file_open_cb(CALLBACK_ARGS)
     if(SINFO[num].nboptions) {
       char file[1024];
       FixWindowsPath(file_chooser_get_name(1), file);
-      sprintf(tmp, "%s \"%s\"", SINFO[num].option_command, file);
+      sprintf(tmp, "\"%s\"", file);
+      sprintf(file, SINFO[num].name_command, tmp);
+      sprintf(tmp, "%s %s", SINFO[num].option_command, file);
       Solver(num, tmp);
     }
   }
 }
+
 void solver_file_edit_cb(CALLBACK_ARGS)
 {
   char prog[1024], file[1024], cmd[1024];
@@ -2922,6 +2964,7 @@ void solver_choose_mesh_cb(CALLBACK_ARGS)
   if(file_chooser(0, 0, "Open mesh file", "*.msh", 0))
     WID->solver[num].input[1]->value(file_chooser_get_name(1));
 }
+
 int nbs(char *str)
 {
   int i, nb = 0;
@@ -2953,9 +2996,6 @@ void solver_command_cb(CALLBACK_ARGS)
     strcpy(mesh, "");
   }
 
-  //printf("num%d idx%d %s -> %d\n", 
-  //     num, idx, SINFO[num].button_command[idx], nbs(SINFO[num].button_command[idx]));
-
   if(nbs(SINFO[num].button_command[idx])) {
     for(i = 0; i < idx; i++)
       usedopts += nbs(SINFO[num].button_command[i]);
@@ -2971,7 +3011,9 @@ void solver_command_cb(CALLBACK_ARGS)
   }
 
   FixWindowsPath((char*)WID->solver[num].input[0]->value(), tmp);
-  sprintf(arg, "\"%s\" %s %s", tmp, mesh, command);
+  sprintf(arg, "\"%s\"", tmp);
+  sprintf(tmp, SINFO[num].name_command, arg);
+  sprintf(arg, "%s %s %s", tmp, mesh, command);
   Solver(num, arg);
 }
 
@@ -3812,4 +3854,3 @@ void con_geometry_define_point_cb(CALLBACK_ARGS)
   CalculateMinMax(THEM->Points, NULL);
   Draw();
 }
-
diff --git a/Fltk/Solvers.cpp b/Fltk/Solvers.cpp
index e7253527ccc03460798b49044557506974475470..db6fc91333f48d9f1c31eb03ddf042db6c85c6da 100644
--- a/Fltk/Solvers.cpp
+++ b/Fltk/Solvers.cpp
@@ -1,4 +1,4 @@
-// $Id: Solvers.cpp,v 1.27 2004-10-17 01:53:49 geuzaine Exp $
+// $Id: Solvers.cpp,v 1.28 2004-10-25 00:45:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -46,6 +46,7 @@ int Solver(int num, char *args)
 {
   int sock, type, stop = 0, i, j, n;
   char command[1024], socket_name[1024], str[1024], prog[1024];
+  char buffer[1024];
 
   FixWindowsPath(SINFO[num].executable_name, prog);
 
@@ -60,7 +61,11 @@ int Solver(int num, char *args)
 
   sprintf(str, "%s.gmshsock-%d", CTX.home_dir, num);
   FixWindowsPath(str, socket_name);
-  sprintf(command, "%s %s -socket \"%s\"", prog, args, socket_name);
+  
+  sprintf(str, "\"%s\"", socket_name);
+  sprintf(buffer, SINFO[num].socket_command, str);
+  
+  sprintf(command, "%s %s %s", prog, args, buffer);
 #if !defined(WIN32)
   strcat(command, " &");
 #endif
diff --git a/Fltk/Solvers.h b/Fltk/Solvers.h
index 0853291c7c214c3dea606d1dae1954925a5b7243..4e79b24710d0b63100ff6b62a4c51cd5476a99ec 100644
--- a/Fltk/Solvers.h
+++ b/Fltk/Solvers.h
@@ -25,6 +25,8 @@
 typedef struct{
   char name[256], extension[32], executable_name[256];
   char mesh_name[256], mesh_command[256];
+  char socket_command[256];
+  char name_command[256];
   char button_name[MAXSOLVERS][32], button_command[MAXSOLVERS][256];
   char option_name[MAXSOLVERS][256], option_command[256];
   char option[MAXSOLVERS][100][256];
@@ -39,4 +41,3 @@ extern SolverInfo SINFO[MAXSOLVERS] ;
 int Solver(int num, char *args);
 
 #endif
-
diff --git a/Plugin/OctreePost.cpp b/Plugin/OctreePost.cpp
index 3408aada1a6b8b62bfcdc9f291c5933813817d33..568631d03ccd4e171241512100ef931b5ce237b9 100644
--- a/Plugin/OctreePost.cpp
+++ b/Plugin/OctreePost.cpp
@@ -1,4 +1,4 @@
-// $Id: OctreePost.cpp,v 1.9 2004-07-07 20:36:32 geuzaine Exp $
+// $Id: OctreePost.cpp,v 1.10 2004-10-25 00:45:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -209,7 +209,7 @@ OctreePost::OctreePost(Post_View *v)
 		    v->BBox[3]-v->BBox[2],
 		    v->BBox[5]-v->BBox[4]};		    
   
-  const int maxElePerBucket = 100; // trade-off memory vs. speed
+  const int maxElePerBucket = 100; // memory vs. speed trade-off
 
   ST = Octree_Create(maxElePerBucket, min, size, 
 		     PostTriangleBB,
diff --git a/doc/CREDITS b/doc/CREDITS
index 0610eeb615fd99454e8a29ec3895c6accb31e3ad..1d46fa21c1dda0dde9a9bbb7a9440afe5b369a6c 100644
--- a/doc/CREDITS
+++ b/doc/CREDITS
@@ -1,4 +1,4 @@
-$Id: CREDITS,v 1.17 2004-10-04 01:08:39 geuzaine Exp $
+$Id: CREDITS,v 1.18 2004-10-25 00:45:47 geuzaine Exp $
 
              Gmsh is copyright (C) 1997-2004 
 
@@ -94,4 +94,5 @@ at debian.org>, Sebastien.Clerc <Sebastien.Clerc at space.alcatel.fr>,
 Jose Miguel Pasini <jmp84 at cornell.edu>, Philippe Lussou <plussou at
 necs.fr>, Jacques Kools <JKools at veeco.com>, Bayram Yenikaya
 <yenikaya at math.umn.edu>, Peter Hornby <p.hornby at arrc.csiro.au>,
-Krishna Mohan Gundu <gkmohan at gmail.com>.
+Krishna Mohan Gundu <gkmohan at gmail.com>, Chris Stott
+<C.Stott@surrey.ac.uk>.
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 6e4385858c53bc449a9ca13de1a66f9234418e29..aeadc26d8cfb947259889cb456739a567b94686c 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,7 +1,8 @@
-$Id: VERSIONS,v 1.256 2004-10-21 17:02:27 geuzaine Exp $
+$Id: VERSIONS,v 1.257 2004-10-25 00:45:47 geuzaine Exp $
 
 New since 1.56: generalized 'raised view' for displacement maps of
-arbitrary view types; new adaptive high order visualization mode;
+arbitrary view types; new adaptive high order visualization mode; new
+solver options (SocketCommand and NameCommand);
 
 New in 1.56: new post-processing option to draw a scalar view raised
 by a displacement view without using Plugin(DisplacementRaise) (makes
diff --git a/doc/texinfo/opt_solver.texi b/doc/texinfo/opt_solver.texi
index eec0c07a7948ad6c10438b0af05e6eae5bce7e59..92b06daeff3414dfd0c15cbaf0576b888dc3f600 100644
--- a/doc/texinfo/opt_solver.texi
+++ b/doc/texinfo/opt_solver.texi
@@ -33,6 +33,16 @@ Command used to specify the mesh file for solver 0@*
 Default value: @code{"-msh %s"}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Solver.SocketCommand0
+Command to specify the socket to solver 0@*
+Default value: @code{"-socket %s"}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Solver.NameCommand0
+Command to specify the problem name to solver 0@*
+Default value: @code{"%s"}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Solver.OptionCommand0
 Command to get options from solver 0@*
 Default value: @code{""}@*
@@ -143,6 +153,16 @@ Command used to specify the mesh file for solver 1@*
 Default value: @code{""}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Solver.SocketCommand1
+Command to specify the socket to solver 1@*
+Default value: @code{"-socket %s"}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Solver.NameCommand1
+Command to specify the problem name to solver 1@*
+Default value: @code{"%s"}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Solver.OptionCommand1
 Command to get options from solver 1@*
 Default value: @code{""}@*
@@ -253,6 +273,16 @@ Command used to specify the mesh file for solver 2@*
 Default value: @code{""}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Solver.SocketCommand2
+Command to specify the socket to solver 2@*
+Default value: @code{"-socket %s"}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Solver.NameCommand2
+Command to specify the problem name to solver 2@*
+Default value: @code{"%s"}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Solver.OptionCommand2
 Command to get options from solver 2@*
 Default value: @code{""}@*
@@ -363,6 +393,16 @@ Command used to specify the mesh file for solver 3@*
 Default value: @code{""}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Solver.SocketCommand3
+Command to specify the socket to solver 3@*
+Default value: @code{"-socket %s"}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Solver.NameCommand3
+Command to specify the problem name to solver 3@*
+Default value: @code{"%s"}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Solver.OptionCommand3
 Command to get options from solver 3@*
 Default value: @code{""}@*
@@ -473,6 +513,16 @@ Command used to specify the mesh file for solver 4@*
 Default value: @code{""}@*
 Saved in: @code{General.OptionsFileName}
 
+@item Solver.SocketCommand4
+Command to specify the socket to solver 4@*
+Default value: @code{"-socket %s"}@*
+Saved in: @code{General.OptionsFileName}
+
+@item Solver.NameCommand4
+Command to specify the problem name to solver 4@*
+Default value: @code{"%s"}@*
+Saved in: @code{General.OptionsFileName}
+
 @item Solver.OptionCommand4
 Command to get options from solver 4@*
 Default value: @code{""}@*
diff --git a/utils/solvers/myperlsolver.opt b/utils/solvers/myperlsolver.opt
index a613720139dde5822817ff97d71fdd3c9eae0e43..9a260c7f131cc3427bf87f59ad27fc57c71eacdb 100644
--- a/utils/solvers/myperlsolver.opt
+++ b/utils/solvers/myperlsolver.opt
@@ -7,6 +7,8 @@ Solver.Executable1 = "./myperlsolver.pl";
 Solver.Extension1 = "";
 Solver.MeshName1 = "";
 Solver.MeshCommand1 = "";
+Solver.SocketCommand1 = "-socket %s";
+Solver.NameCommand1 = "%s";
 Solver.OptionCommand1 = "-options";
 Solver.FirstOption1 = "Option";
 Solver.SecondOption1 = "";
diff --git a/utils/solvers/mysolver.opt b/utils/solvers/mysolver.opt
index 4ebb77fca92cbc7e90c40b06c0f2b23cade932cf..c03fca0237fe8e16a44241e87dfc38e1502cf192 100644
--- a/utils/solvers/mysolver.opt
+++ b/utils/solvers/mysolver.opt
@@ -7,6 +7,8 @@ Solver.Executable1 = "./mysolver.exe";
 Solver.Extension1 = "";
 Solver.MeshName1 = "";
 Solver.MeshCommand1 = "";
+Solver.SocketCommand1 = "-socket %s";
+Solver.NameCommand1 = "%s";
 Solver.OptionCommand1 = "-options";
 Solver.FirstOption1 = "Option";
 Solver.SecondOption1 = "";