diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 57d79b22062c0e202646bf8b6e58169cfa6f717d..57961827beaaec898604e52294e3f78c7af67b5f 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.283 2004-10-16 22:15:16 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.284 2004-10-17 01:53:49 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1537,15 +1537,17 @@ void _replace_multi_format(char *in, char *val, char *out){
 
 void help_online_cb(CALLBACK_ARGS)
 {
-  char cmd[1000];
-  _replace_multi_format(CTX.web_browser, "http://www.geuz.org/gmsh/doc/texinfo/", cmd);
+  char prog[1024], cmd[1024];
+  FixWindowsPath(CTX.web_browser, prog);
+  _replace_multi_format(prog, "http://www.geuz.org/gmsh/doc/texinfo/", cmd);
   SystemCall(cmd);
 }
 
 void help_credits_cb(CALLBACK_ARGS)
 {
-  char cmd[1000];
-  _replace_multi_format(CTX.web_browser, "http://www.geuz.org/gmsh/doc/CREDITS", cmd);
+  char prog[1024], cmd[1024];
+  FixWindowsPath(CTX.web_browser, prog);
+  _replace_multi_format(prog, "http://www.geuz.org/gmsh/doc/CREDITS", cmd);
   SystemCall(cmd);
 }
 
@@ -1595,8 +1597,10 @@ void geometry_physical_cb(CALLBACK_ARGS)
 
 void geometry_edit_cb(CALLBACK_ARGS)
 {
-  char cmd[1000];
-  _replace_multi_format(CTX.editor, CTX.filename, cmd);
+  char prog[1024], file[1024], cmd[1024];
+  FixWindowsPath(CTX.editor, prog);
+  FixWindowsPath(CTX.filename, file);
+  _replace_multi_format(prog, file, cmd);
   SystemCall(cmd);
 }
 
@@ -2467,11 +2471,10 @@ static void _add_physical(char *what)
         add_physical(List1, CTX.filename, type, &num);
 
 	GMSH_Solve_Plugin *sp = GMSH_PluginManager::instance()->findSolverPlugin();
-	if (sp)
-	  {
-	    sp->receiveNewPhysicalGroup(type,num);
-	    sp->writeSolverFile(CTX.filename);
-	  }
+	if (sp){
+	  sp->receiveNewPhysicalGroup(type,num);
+	  sp->writeSolverFile(CTX.filename);
+	}
 
         List_Reset(List1);
         ZeroHighlight(THEM);
@@ -2877,8 +2880,9 @@ void solver_cb(CALLBACK_ARGS)
     WID->solver[num].input[0]->value(file);
   }
   if(SINFO[num].nboptions) {
-    sprintf(tmp, "%s \"%s\"", SINFO[num].option_command,
-            (char *)WID->solver[num].input[0]->value());
+    char file[1024];
+    FixWindowsPath((char *)WID->solver[num].input[0]->value(), file);
+    sprintf(tmp, "%s \"%s\"", SINFO[num].option_command, file);           
     Solver(num, tmp);
   }
   WID->create_solver_window(num);
@@ -2895,17 +2899,20 @@ void solver_file_open_cb(CALLBACK_ARGS)
   if(file_chooser(0, 1, "Open problem definition file", tmp, 0)) {
     WID->solver[num].input[0]->value(file_chooser_get_name(1));
     if(SINFO[num].nboptions) {
-      sprintf(tmp, "%s \"%s\"", SINFO[num].option_command,
-              file_chooser_get_name(1));
+      char file[1024];
+      FixWindowsPath(file_chooser_get_name(1), file);
+      sprintf(tmp, "%s \"%s\"", SINFO[num].option_command, file);
       Solver(num, tmp);
     }
   }
 }
 void solver_file_edit_cb(CALLBACK_ARGS)
 {
-  char cmd[1000];
+  char prog[1024], file[1024], cmd[1024];
   int num = (int)data;
-  sprintf(cmd, CTX.editor, WID->solver[num].input[0]->value());
+  FixWindowsPath(CTX.editor, prog);
+  FixWindowsPath((char*)WID->solver[num].input[0]->value(), file);
+  _replace_multi_format(prog, file, cmd);
   SystemCall(cmd);
 }
 
@@ -2938,7 +2945,8 @@ void solver_command_cb(CALLBACK_ARGS)
     WID->create_message_window();
 
   if(strlen(WID->solver[num].input[1]->value())) {
-    sprintf(tmp, "\"%s\"", WID->solver[num].input[1]->value());
+    FixWindowsPath((char*)WID->solver[num].input[1]->value(), mesh);
+    sprintf(tmp, "\"%s\"", mesh);
     sprintf(mesh, SINFO[num].mesh_command, tmp);
   }
   else {
@@ -2956,16 +2964,14 @@ void solver_command_cb(CALLBACK_ARGS)
       return;
     }
     sprintf(command, SINFO[num].button_command[idx],
-            SINFO[num].option[usedopts][WID->solver[num].choice[usedopts]->
-                                        value()]);
+            SINFO[num].option[usedopts][WID->solver[num].choice[usedopts]->value()]);
   }
   else {
     strcpy(command, SINFO[num].button_command[idx]);
   }
 
-  sprintf(arg, "\"%s\" %s %s", WID->solver[num].input[0]->value(), mesh,
-          command);
-
+  FixWindowsPath((char*)WID->solver[num].input[0]->value(), tmp);
+  sprintf(arg, "\"%s\" %s %s", tmp, mesh, command);
   Solver(num, arg);
 }
 
diff --git a/Fltk/Solvers.cpp b/Fltk/Solvers.cpp
index 8a71c879e579804bdd0b93552e061cc5b61cf448..e7253527ccc03460798b49044557506974475470 100644
--- a/Fltk/Solvers.cpp
+++ b/Fltk/Solvers.cpp
@@ -1,4 +1,4 @@
-// $Id: Solvers.cpp,v 1.26 2004-07-30 12:22:02 geuzaine Exp $
+// $Id: Solvers.cpp,v 1.27 2004-10-17 01:53:49 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -45,17 +45,22 @@ SolverInfo SINFO[MAXSOLVERS];
 int Solver(int num, char *args)
 {
   int sock, type, stop = 0, i, j, n;
-  char command[1000], socket_name[1000], str[1000];
+  char command[1024], socket_name[1024], str[1024], prog[1024];
+
+  FixWindowsPath(SINFO[num].executable_name, prog);
 
   if(!SINFO[num].client_server) {
-    sprintf(command, "%s %s &", SINFO[num].executable_name, args);
+    sprintf(command, "%s %s", prog, args);
+#if !defined(WIN32)
+    strcat(command, " &");
+#endif
     Gmsh_StartClient(command, NULL);
     return 1;
   }
 
-  sprintf(socket_name, "%s.gmshsock-%d", CTX.home_dir, num);
-  sprintf(command, "%s %s -socket \"%s\"", SINFO[num].executable_name,
-          args, socket_name);
+  sprintf(str, "%s.gmshsock-%d", CTX.home_dir, num);
+  FixWindowsPath(str, socket_name);
+  sprintf(command, "%s %s -socket \"%s\"", prog, args, socket_name);
 #if !defined(WIN32)
   strcat(command, " &");
 #endif
@@ -73,9 +78,8 @@ int Solver(int num, char *args)
       Msg(GERROR, "Socket listen failed on '%s'", socket_name);
       break;
     case -4:
-      Msg(GERROR,
-          "Solver not responding (is '%s' correctly installed and in your path?)",
-          SINFO[num].executable_name);
+      Msg(GERROR, "Socket listen timeout on '%s'", socket_name);
+      Msg(GERROR, "Is '%s' correctly installed?", prog);
       break;
     case -5:
       Msg(GERROR, "Socket accept failed on '%s'", socket_name);
diff --git a/Parser/OpenFile.cpp b/Parser/OpenFile.cpp
index 6046ff6190cba1b2370cb4de4036fa46de5e54c9..a8f4d2678919f907204f1d1500b522a46c9f1e66 100644
--- a/Parser/OpenFile.cpp
+++ b/Parser/OpenFile.cpp
@@ -1,4 +1,4 @@
-// $Id: OpenFile.cpp,v 1.62 2004-09-13 18:02:52 geuzaine Exp $
+// $Id: OpenFile.cpp,v 1.63 2004-10-17 01:53:49 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -19,6 +19,10 @@
 // 
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
+#if defined(__CYGWIN__)
+#include <sys/cygwin.h>
+#endif
+
 #include "Gmsh.h"
 #include "Numeric.h"
 #include "Context.h"
@@ -58,6 +62,14 @@ void FixRelativePath(char *in, char *out){
   }
 }
 
+void FixWindowsPath(char *in, char *out){
+#if defined(__CYGWIN__)
+  cygwin_conv_to_win32_path(in, out);
+#else
+  strcpy(out, in);
+#endif
+}
+
 void SetBoundingBox(double xmin, double xmax,
 		    double ymin, double ymax, 
 		    double zmin, double zmax)
@@ -320,40 +332,16 @@ void OpenProblemMacFinder(const char *filename)
   }
 }
 
-// replace "/cygwin/x/" with "x:/"
-void decygwin(char *in, char *out)
-{
-  unsigned int i = 0, j = 0;
-
-  while(i < strlen(in)) {
-    if(!strncmp(in + i, "/cygdrive/", 10)) {
-      out[j++] = in[i + 10];    // drive letter
-      out[j++] = ':';
-      out[j++] = '/';
-      i += 12;
-    }
-    else {
-      out[j++] = in[i++];
-    }
-  }
-  out[j] = '\0';
-}
-
 void SystemCall(char *command)
 {
 #if defined(WIN32) && defined(HAVE_FLTK)
   STARTUPINFO suInfo;           // Process startup information
   PROCESS_INFORMATION prInfo;   // Process information
-
   memset(&suInfo, 0, sizeof(suInfo));
   suInfo.cb = sizeof(suInfo);
-
-  char copy[strlen(command) + 1];
-  decygwin(command, copy);
-  Msg(INFO, "Calling '%s'", copy);
-  CreateProcess(NULL, copy, NULL, NULL, FALSE,
+  Msg(INFO, "Calling '%s'", command);
+  CreateProcess(NULL, command, NULL, NULL, FALSE,
                 NORMAL_PRIORITY_CLASS, NULL, NULL, &suInfo, &prInfo);
-
 #else
   if(!system(NULL)) {
     Msg(GERROR, "Could not find /bin/sh: aborting system call");
diff --git a/Parser/OpenFile.h b/Parser/OpenFile.h
index c1407700e532e3b7492dc820c98cb3f0df7ed106..036663c954dac5bed4558bb7dfb30848ef42ebbc 100644
--- a/Parser/OpenFile.h
+++ b/Parser/OpenFile.h
@@ -27,6 +27,7 @@ void OpenProblemMacFinder(const char *filename);
 int MergeProblem(char *filename, int warn_if_missing=0);
 void SystemCall(char *command);
 void FixRelativePath(char *in, char *out);
+void FixWindowsPath(char *in, char *out);
 void SetBoundingBox(double xmin, double xmax,
 		    double ymin, double ymax, 
 		    double zmin, double zmax);