diff -upr /winsup/environ.cc winsup/environ.cc
--- /winsup/environ.cc	Sat Jan 09 23:55:22 1999
+++ winsup/environ.cc	Sun Jan 10 10:32:44 1999
@@ -22,6 +22,7 @@ extern BOOL strip_title_path;
 extern DWORD chunksize;
 BOOL threadsafe;
 BOOL reset_com = TRUE;
+BOOL use_mixed = FALSE;
 static BOOL envcache = TRUE;
 
 /* List of names which are converted from dos to unix
@@ -378,6 +379,7 @@ parse_options (char *buf)
       add ("binmode", user_data->fmode_ptr, justset, 0, O_BINARY);
       add ("strace", strace_init, isfunc, (char *) "0", (char *) "1");
       add ("ntea", &allow_ntea, justset, FALSE, TRUE);
+      add ("mixed", &use_mixed, justset, FALSE, TRUE); 
       add ("reset_com", &reset_com, justset, FALSE, TRUE);
       add ("envcache", &envcache, justset, TRUE, FALSE);
       add ("threadsafe", &threadsafe, justset, TRUE, FALSE);
diff -upr /winsup/fhandler.cc winsup/fhandler.cc
--- /winsup/fhandler.cc	Sat Jan 09 23:55:22 1999
+++ winsup/fhandler.cc	Sun Jan 10 10:31:29 1999
@@ -267,6 +267,8 @@ fhandler_base::open (int flags, mode_t m
   shared = host_dependent.shared;
 
   file_attributes = FILE_ATTRIBUTE_NORMAL;
+  if (use_mixed)
+    file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
   if (flags & O_DIROPEN)
     file_attributes |= FILE_FLAG_BACKUP_SEMANTICS;
   if (get_device () == FH_SERIAL)
diff -upr /winsup/ntea.cc winsup/ntea.cc
--- /winsup/ntea.cc	Sat Jan 09 23:55:23 1999
+++ winsup/ntea.cc	Sun Jan 10 10:31:30 1999
@@ -93,12 +93,17 @@ NTReadEA (const char *file, const char *
     int eafound = 0;
     PFILE_FULL_EA_INFORMATION ea, sea;
     int easize;
+    int file_attributes;
+
+    file_attributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
+    if (use_mixed)
+      file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
 
     hFileSource = CreateFile (file, FILE_READ_EA,
 	FILE_SHARE_READ | FILE_SHARE_WRITE,
 	&sec_none_nih, // sa
 	OPEN_EXISTING,
-	FILE_FLAG_BACKUP_SEMANTICS,
+	file_attributes,
 	NULL
 	);
 
@@ -267,12 +272,17 @@ NTWriteEA (const char *file, const char 
   DWORD StreamSize, easize;
   BOOL bSuccess=FALSE;
   PFILE_FULL_EA_INFORMATION ea;
+  int file_attributes;
+  
+  file_attributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
+  if (use_mixed)
+    file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
 
   hFileSource = CreateFile (file, FILE_WRITE_EA,
 			    FILE_SHARE_READ | FILE_SHARE_WRITE,
 			    &sec_none_nih, // sa
 			    OPEN_EXISTING,
-			    FILE_FLAG_BACKUP_SEMANTICS,
+			    file_attributes,
 			    NULL);
 
   if (hFileSource == INVALID_HANDLE_VALUE)
@@ -384,12 +394,17 @@ usage:
       HANDLE hFileSource;
       PFILE_FULL_EA_INFORMATION ea, sea;
       unsigned easize;
+      int file_attributes;
+
+      file_attributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
+      if (use_mixed)
+        file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
 
       hFileSource = CreateFile (FileSource, FILE_READ_EA,
 				FILE_SHARE_READ | FILE_SHARE_WRITE,
 				&sec_none_nih, // sa
 				OPEN_EXISTING,
-				FILE_FLAG_BACKUP_SEMANTICS,
+				file_attributes,
 				NULL);
 
       if (hFileSource == INVALID_HANDLE_VALUE)
diff -upr /winsup/path.cc winsup/path.cc
--- /winsup/path.cc	Sat Jan 09 23:55:23 1999
+++ winsup/path.cc	Sun Jan 10 10:31:30 1999
@@ -395,7 +395,7 @@ const char *windows_device_names[] =
   "\\dev\\disk",
   "\\dev\\fd%d",
   "\\dev\\st%d",
-  "nul",
+  "NUL",
 };
 
 int
@@ -1474,6 +1474,7 @@ symlink_check_one (const char *in_path, 
 {
   HANDLE h;
   int res = 0;
+  int file_attributes;
   char extbuf[buflen + 5];
   char *ext_here;
   const char *path = in_path;
@@ -1536,8 +1537,12 @@ symlink_check_one (const char *in_path, 
 
       /* Open the file.  */
 
+      file_attributes = FILE_ATTRIBUTE_NORMAL;
+      if (use_mixed)
+        file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
+
       h = CreateFileA (path, GENERIC_READ, FILE_SHARE_READ, &sec_none_nih, OPEN_EXISTING,
-		       FILE_ATTRIBUTE_NORMAL, 0);
+		       file_attributes, 0);
 
       res = -1;
       if (h == INVALID_HANDLE_VALUE)
diff -upr /winsup/spawn.cc winsup/spawn.cc
--- /winsup/spawn.cc	Sat Jan 09 23:55:23 1999
+++ winsup/spawn.cc	Sun Jan 10 10:31:30 1999
@@ -26,6 +26,7 @@ suffix_info std_suffixes[] =
   suffix_info (NULL)
 };
 
+
 /* Add .exe to PROG if not already present and see if that exists.
    If not, return PROG (converted from posix to win32 rules if necessary).
    The result is always BUF.
@@ -170,6 +171,7 @@ spawn_guts (HANDLE hToken, const char * 
   char *copy;
   BOOL rc;
   int argc;
+  int file_attributes;
 
   hExeced = NULL;
 
@@ -281,6 +283,10 @@ spawn_guts (HANDLE hToken, const char * 
 
   /* Check if it's a script.  */
 
+  file_attributes = FILE_ATTRIBUTE_NORMAL;
+  if (use_mixed)
+    file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
+
   /* if the file name ends in either .exe, .com, .bat, or .cmd we assume
      that it is NOT a script file */
   while (*ext == '\0')
@@ -290,7 +296,7 @@ spawn_guts (HANDLE hToken, const char * 
 				FILE_SHARE_READ | FILE_SHARE_WRITE,
 				&sec_none_nih,
 				OPEN_EXISTING,
-				FILE_ATTRIBUTE_NORMAL,
+				file_attributes,
 				0);
       if (hnd == INVALID_HANDLE_VALUE)
 	{
diff -upr /winsup/syscalls.cc winsup/syscalls.cc
--- /winsup/syscalls.cc	Sat Jan 09 23:55:24 1999
+++ winsup/syscalls.cc	Sun Jan 10 10:31:30 1999
@@ -37,6 +37,23 @@ close_all_files (void)
   cygwin_shared->delqueue.process_queue ();
 }
 
+static
+BOOL
+remove_file (char * name)
+{
+  if (!use_mixed)
+    return DeleteFileA (name);
+
+  HANDLE h;
+
+  h = CreateFileA (name, GENERIC_WRITE, host_dependent.shared, NULL,
+	OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_POSIX_SEMANTICS,
+	NULL);
+  if (h == INVALID_HANDLE_VALUE)
+    return FALSE;
+  return CloseHandle (h);
+}
+
 extern "C"
 int
 _unlink (const char *ourname)
@@ -61,7 +78,7 @@ _unlink (const char *ourname)
       return -1;
     }
 
-  if (!DeleteFileA (win32_name.get_win32 ()))
+  if (!remove_file (win32_name.get_win32 ()))
     {
       res = GetLastError ();
 
@@ -74,7 +91,7 @@ _unlink (const char *ourname)
 	  /* chmod ourname to be writable here */
 	  res = chmod (ourname, 0777);
 
-	  if (DeleteFileA (win32_name.get_win32 ()))
+	  if (remove_file (win32_name.get_win32 ()))
 	    {
 	      res = GetLastError ();
 	      syscall_printf ("%d = unlink (%s)", res, ourname);
@@ -477,6 +494,11 @@ _link (const char *a, const char *b)
       char buf[MAX_PATH];
 
       BOOL bSuccess;
+      int file_attributes;
+
+      file_attributes = FILE_ATTRIBUTE_NORMAL;
+      if (use_mixed)
+        file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
 
       hFileSource = CreateFile (
 	real_a.get_win32 (),
@@ -484,7 +506,7 @@ _link (const char *a, const char *b)
 	FILE_SHARE_READ | FILE_SHARE_WRITE /*| FILE_SHARE_DELETE*/,
 	&sec_none_nih, // sa
 	OPEN_EXISTING,
-	0,
+	file_attributes,
 	NULL
 	);
 
@@ -685,6 +707,7 @@ chown (const char * name, uid_t uid, gid
       SID_NAME_USE acc_type;
       struct passwd *pw_ptr;
       struct group *gr_ptr;
+      int file_attributes;
 
       /* converting user and group id to names */
       if ((pw_ptr = getpwuid (uid)) == NULL)
@@ -749,11 +772,15 @@ chown (const char * name, uid_t uid, gid
 	  return -1;
 	}
 
+      file_attributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
+      if (use_mixed)
+        file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
+
       /* open the file for read */
       hFile = CreateFile (win32_path.get_win32 (), GENERIC_READ,
 			   FILE_SHARE_READ | FILE_SHARE_WRITE,
 			   &sec_none_nih, OPEN_EXISTING,
-			   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+			   file_attributes,
 			   NULL);
 
       if (hFile == INVALID_HANDLE_VALUE)
@@ -885,7 +912,7 @@ retry:
 			     FILE_SHARE_READ | FILE_SHARE_WRITE,
 			     &sec_none_nih,
 			     OPEN_EXISTING,
-			     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+			     file_attributes,
 			     NULL);
 
 		  if (hFile == INVALID_HANDLE_VALUE)
@@ -2102,18 +2129,22 @@ int
 logout (char *line)
 {
   int res = 0;
+  int file_attributes;
   HANDLE ut_fd;
 
   path_conv win32_path (_PATH_UTMP);
   if (win32_path.error)
     return 0;
 
+  file_attributes = FILE_ATTRIBUTE_NORMAL;
+  if (use_mixed)
+    file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
   ut_fd = CreateFile (win32_path.get_win32 (),
 			GENERIC_READ | GENERIC_WRITE,
 			FILE_SHARE_READ | FILE_SHARE_WRITE,
 			&sec_none_nih,
 			OPEN_EXISTING,
-			FILE_ATTRIBUTE_NORMAL,
+			file_attributes,
 			NULL);
   if (ut_fd != INVALID_HANDLE_VALUE)
     {
diff -upr /winsup/times.cc winsup/times.cc
--- /winsup/times.cc	Sat Jan 09 23:55:24 1999
+++ winsup/times.cc	Sun Jan 10 10:31:30 1999
@@ -19,6 +19,7 @@ details. */
 #define FACTOR (0x19db1ded53ea710LL)
 #define NSPERSEC 10000000LL
 
+
 static void
 timeval_to_filetime (timeval *time, FILETIME *out);
 
@@ -439,6 +440,7 @@ utimes (const char *path, struct timeval
 {
   int res = 0;
   struct timeval tmp[2];
+  int file_attributes;
   path_conv win32 (path);
 
   if (win32.error)
@@ -448,6 +450,10 @@ utimes (const char *path, struct timeval
       return -1;
     }
 
+  file_attributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
+  if (use_mixed)
+    file_attributes |= FILE_FLAG_POSIX_SEMANTICS;
+
   /* MSDN suggests using FILE_FLAG_BACKUP_SEMANTICS for accessing
      the times of directories.  FIXME: what about Win95??? */
   HANDLE h = CreateFileA (win32.get_win32 (),
@@ -455,7 +461,7 @@ utimes (const char *path, struct timeval
 			  FILE_SHARE_READ | FILE_SHARE_WRITE,
 			  &sec_none_nih,
 			  OPEN_EXISTING,
-			  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+			  file_attributes,
 			  0);
 
   if (h == INVALID_HANDLE_VALUE)
diff -upr /winsup/winsup.h winsup/winsup.h
--- /winsup/winsup.h	Sat Jan 09 23:55:24 1999
+++ winsup/winsup.h	Sun Jan 10 10:31:30 1999
@@ -279,6 +279,7 @@ extern unsigned int signal_shift_subtrac
 #define in(x)
 #define out(x)
 #endif
+extern BOOL use_mixed;
 
 #define api_fatal(fmt, args...) \
     ({\
