diff --git a/NT/init_nt b/NT/init_nt
index eeb3e110471ef24d7d7d88e78c2eb3da306e48f0..24e0d5d55cac7c821ea5a5bcb8b978143bff80a7 100755
--- a/NT/init_nt
+++ b/NT/init_nt
@@ -1,5 +1,8 @@
 #!/bin/sh
 
+#This can be 'sprsh' or 'wine'
+REMOTE_METHOD=sprsh
+
 # Edit
 NTHOST=10.0.4.10
 NTDRIVE='j:'
@@ -14,6 +17,10 @@ USE_SPRSH=yes
 # Port for sprsh
 NTPORT=4711
 
+#These are only used if you use wine
+watcom=D:\\CDROM
+INCLUDE="$watcom\\H;$watcom\\H\\NT"
+
 # Don't edit
 
 base=`pwd`
@@ -35,18 +42,23 @@ fi
 IFS=' 	
 
'
 
-export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE NTPORT USE_SPRSH NTMOUNT IFS
+export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE 
+export NTPORT USE_SPRSH NTMOUNT IFS REMOTE_METHOD watcom INCLUDE
 
 case /$SHELL-$TERM in
    */bash-xterm)
-     PROMPT_COMMAND="echo -n ]2\; Remote NT compile ]1\; rntcc"
+     PROMPT_COMMAND="echo -n ]2\; $REMOTE_METHOD NT compile ]1\; rntcc"
      export PROMPT_COMMAND
    ;;
 esac
 
 case /$SHELL in
    */bash)
-     PS1="NT $NTHOST \\$ "
+     if [ $REMOTE_METHOD = sprsh ]; then
+       PS1="NT $NTHOST \\$ "
+     else
+       PS1="WINE \\$ "
+     fi
      export PS1
    ;;
 esac
diff --git a/NT/tools/lib.pike b/NT/tools/lib.pike
index fa8bc901629e0f8726e6fd74d9f8fbe8e793aeae..cdfc3fe89df5c40c9e4a60c183c18a5caa778922 100644
--- a/NT/tools/lib.pike
+++ b/NT/tools/lib.pike
@@ -15,61 +15,90 @@ string fixabspath(string s)
   return replace(s,"/","\\");
 }
 
-string handle_input(object o)
-{
-  if(o->proxy)
-    o->proxy(Stdio.File("stdin"));
-  else
-    thread_create(lambda(object o)
-		 {
-		   object stdin=Stdio.File("stdin");
-		   while(string s=stdin->read(1000,1))
-		     o->write(s);
-		 },o);
-}
-
-
-object low_do_cmd(string *cmd)
-{
-  object(Stdio.File) f=Stdio.File();
-  if(!f->connect(getenv("NTHOST"),(int)getenv("NTPORT")))
-  {
-    werror("Failed to connect "+strerror(errno())+".\n");
-    exit(1);
-  }
-
-  string tmp=getcwd();
-  string mnt=getenv("NTMOUNT");
-  if(mnt && strlen(mnt)) tmp=replace(tmp,mnt,"");
-  cmd=({getenv("NTDRIVE")+replace(tmp,"/","\\")})+cmd;
-  f->write(sprintf("%4c",sizeof(cmd)));
-  for(int e=0;e<sizeof(cmd);e++)
-    f->write(sprintf("%4c%s",strlen(cmd[e]),cmd[e]));
-  return f;
-}
-
 int silent_do_cmd(string *cmd, mixed|void filter, int|void silent)
 {
-  object(Stdio.File) f=low_do_cmd(cmd);
-
-  handle_input(f);
   string ret="";
-  while(1)
+  object(Stdio.File) f=Stdio.File();
+
+  switch(getenv("REMOTE_METHOD"))
   {
-    string s;
-    sscanf(f->read(4),"%4c",int len);
-    if(!len) break;
-    s=f->read(len);
-    s=replace(s,"\r\n","\n");
-    if(!silent) write(s);
-    ret+=s;
+    default:
+      werror("Unknown REMOTE method %s\n",getenv("REMOTE_METHOD"));
+      break;
+
+    case "wine":
+    case "WINE":
+#if 0
+      if(!silent && !filter)
+      {
+	return Process.create_process(({"wine",cmd*" "}))->wait();
+      }
+      else
+#endif
+      {
+	object o=f->pipe(Stdio.PROP_BIDIRECTIONAL | Stdio.PROP_IPC);
+	object proc=Process.create_process(({"wine",
+					       "-debugmsg","fixme-all",
+					       cmd*" "}),
+					   (["stdout":o]));
+	destruct(o);
+	while(1)
+	{
+	  string s=f->read(8192,1);
+	  if(!s || !strlen(s)) break;
+	  s=replace(s,"\r\n","\n");
+	  if(!silent) write(s);
+	  ret+=s;
+	}
+	if(filter) filter(ret);
+	destruct(f);
+	return proc->wait();
+      }
+
+    case 0:
+    case "sprsh":
+    case "SPRSH":
+      string tmp=getcwd();
+      string mnt=getenv("NTMOUNT");
+      if(mnt && strlen(mnt)) tmp=replace(tmp,mnt,"");
+      cmd=({getenv("NTDRIVE")+replace(tmp,"/","\\")})+cmd;
+      if(!f->connect(getenv("NTHOST"),(int)getenv("NTPORT")))
+      {
+	werror("Failed to connect "+strerror(errno())+".\n");
+	exit(1);
+	}
+      
+      f->write(sprintf("%4c",sizeof(cmd)));
+      for(int e=0;e<sizeof(cmd);e++)
+	f->write(sprintf("%4c%s",strlen(cmd[e]),cmd[e]));
+
+      if(f->proxy)
+	f->proxy(Stdio.File("stdin"));
+      else
+	thread_create(lambda(object f)
+		      {
+			object stdin=Stdio.File("stdin");
+			while(string s=stdin->read(1000,1))
+			  f->write(s);
+		      },f);
+
+      while(1)
+      {
+	string s;
+	sscanf(f->read(4),"%4c",int len);
+	if(!len) break;
+	s=f->read(len);
+	s=replace(s,"\r\n","\n");
+	if(!silent) write(s);
+	ret+=s;
+      }
+      if(filter) filter(ret);
+      sscanf(f->read(4),"%4c",int code);
+      f->close("r");
+      f->close("w");
+      destruct(f);
+      return code;
   }
-  if(filter) filter(ret);
-  sscanf(f->read(4),"%4c",int code);
-  f->close("r");
-  f->close("w");
-  destruct(f);
-  return code;
 }
 
 string tmp;
@@ -84,20 +113,21 @@ string popen_cmd(string *cmd)
 string getntenv(string var)
 {
   string s="";
-  object(Stdio.File) f=low_do_cmd( ({"getenv",var}) );
-  
-  while(1)
+  switch(getenv("REMOTE_METHOD"))
   {
-    sscanf(f->read(4),"%4c", int len);
-    if(!len) break;
-    s+=f->read(len);
+    default:
+      werror("Unknown REMOTE method %s\n",getenv("REMOTE_METHOD"));
+      break;
+
+    case "wine":
+    case "WINE":
+      return getenv(var) || getenv(lower_case(var));
+
+    case 0:
+    case "sprsh":
+    case "SPRSH":
+      return popen_cmd( ({"getenv",var}) );
   }
-
-  sscanf(f->read(4),"%4c",int code);
-  f->close("r");
-  f->close("w");
-  destruct(f);
-  return s;
 }
 
 
diff --git a/NT/tools/rntcc b/NT/tools/rntcc
index 78d1bb25a7a3ee0439f9a081ad04959ba391e7da..76c5987c944b270042f7234da84b6da43583b6e8 100755
--- a/NT/tools/rntcc
+++ b/NT/tools/rntcc
@@ -50,6 +50,10 @@ int compile(string *sources,
 
     case "s":
       cmd=({ "wasm", "-fe"+errorfile, "-fo"+dest,})+ sources;
+
+    default:
+      werror("Don't know how to compile %s\n",sources[0]);
+      exit(1);
   }
       
   if(verbose)