diff --git a/files/dos_fs.c b/files/dos_fs.c
index 734c5ea..d1eb7b5 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -35,7 +35,7 @@
 #include "options.h"
 #include "debugtools.h"
 
-DECLARE_DEBUG_CHANNEL(dosfs)
+DEFAULT_DEBUG_CHANNEL(dosfs)
 DECLARE_DEBUG_CHANNEL(file)
 
 /* Define the VFAT ioctl to get both short and long file names */
@@ -528,13 +528,13 @@
     while (len > 1 && name[len-1] == '.') len--;
     if (long_len < len + 1) return FALSE;
 
-    TRACE_(dosfs)("%s,%s\n", path, name );
+    TRACE("%s,%s\n", path, name );
 
     if (!DOSFS_ToDosFCBFormat( name, dos_name )) dos_name[0] = '\0';
 
     if (!(dir = DOSFS_OpenDir( path )))
     {
-        WARN_(dosfs)("(%s,%s): can't open dir: %s\n",
+        WARN("(%s,%s): can't open dir: %s\n",
                        path, name, strerror(errno) );
         return FALSE;
     }
@@ -574,11 +574,11 @@
             else
                 DOSFS_Hash( long_name, short_buf, FALSE, ignore_case );
         }
-        TRACE_(dosfs)("(%s,%s) -> %s (%s)\n",
-		     path, name, long_name, short_buf ? short_buf : "***");
+        TRACE("(%s,%s) -> %s (%s)\n",
+              path, name, long_name, short_buf ? short_buf : "***");
     }
     else
-        WARN_(dosfs)("'%s' not found in '%s'\n", name, path);
+        WARN("'%s' not found in '%s'\n", name, path);
     DOSFS_CloseDir( dir );
     return ret;
 }
@@ -666,7 +666,7 @@
 				to_dup = GetStdHandle( STD_OUTPUT_HANDLE );
 				break;
 			default:
-				FIXME_(dosfs)("can't open CON read/write\n");
+				FIXME("can't open CON read/write\n");
 				return HFILE_ERROR;
 				break;
 			}
@@ -688,7 +688,7 @@
 		    if(devname[0])
 		    {
 			TRACE_(file)("DOSFS_OpenDevice %s is %s\n",
-				DOSFS_Devices[i].name,devname);
+                                     DOSFS_Devices[i].name,devname);
 			r =  FILE_CreateFile( devname, access,
 				FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
 				OPEN_EXISTING, 0, -1 );
@@ -697,7 +697,7 @@
 		    }
 		}
 
-		FIXME_(dosfs)("device open %s not supported (yet)\n",DOSFS_Devices[i].name);
+		FIXME("device open %s not supported (yet)\n",DOSFS_Devices[i].name);
     		return HFILE_ERROR;
 	    }
         }
@@ -757,8 +757,7 @@
     UINT flags;
     char *p_l, *p_s, *root;
 
-    TRACE_(dosfs)("%s (last=%d)\n",
-                   name, check_last );
+    TRACE("%s (last=%d)\n", name, check_last );
 
     if ((full->drive = DOSFS_GetPathDrive( &name )) == -1) return FALSE;
     flags = DRIVE_GetFlags( full->drive );
@@ -870,8 +869,7 @@
     }
     if (!full->long_name[0]) strcpy( full->long_name, "/" );
     if (!full->short_name[2]) strcpy( full->short_name + 2, "\\" );
-    TRACE_(dosfs)("returning %s = %s\n",
-                   full->long_name, full->short_name );
+    TRACE("returning %s = %s\n", full->long_name, full->short_name );
     return TRUE;
 }
 
@@ -1070,7 +1068,7 @@
     char *endchar = buffer + sizeof(buffer) - 2;
     *endchar = '\0';
     
-    TRACE_(dosfs)("converting '%s'\n", name );
+    TRACE("converting '%s'\n", name );
 
     if (!name || ((drive = DOSFS_GetPathDrive( &name )) == -1) )
     {   SetLastError( ERROR_INVALID_PARAMETER );
@@ -1144,7 +1142,7 @@
 	    lstrcpynA( result, buffer, len );
     }
 
-    TRACE_(dosfs)("returning '%s'\n", buffer );
+    TRACE("returning '%s'\n", buffer );
 
     /* If the lpBuffer buffer is too small, the return value is the 
     size of the buffer, in characters, required to hold the path. */
@@ -1278,7 +1276,7 @@
         lstrcpynA( p, long_name, sizeof(buffer) - (int)(p - buffer) );
         if (!FILE_Stat( buffer, &fileinfo ))
         {
-            WARN_(dosfs)("can't stat %s\n", buffer);
+            WARN("can't stat %s\n", buffer);
             continue;
         }
         if (fileinfo.dwFileAttributes & ~attr) continue;
@@ -1300,9 +1298,9 @@
 
         lstrcpynA( entry->cFileName, long_name, sizeof(entry->cFileName) );
         if (!(flags & DRIVE_CASE_PRESERVING)) CharLowerA( entry->cFileName );
-        TRACE_(dosfs)("returning %s (%s) %02lx %ld\n",
-                       entry->cFileName, entry->cAlternateFileName,
-                       entry->dwFileAttributes, entry->nFileSizeLow );
+        TRACE("returning %s (%s) %02lx %ld\n",
+              entry->cFileName, entry->cAlternateFileName,
+              entry->dwFileAttributes, entry->nFileSizeLow );
         return 1;
     }
     return 0;  /* End of directory */
@@ -1865,7 +1863,7 @@
     LPSTR s;
     char  buffer[200];
 
-    TRACE_(dosfs)("(%s,...)\n",devname?devname:"<null>");
+    TRACE("(%s,...)\n", devname ? devname : "<null>");
     if (!devname) {
 	/* return known MSDOS devices */
 	strcpy(buffer,"CON COM1 COM2 LPT1 NUL ");
@@ -1941,7 +1939,7 @@
  *           DefineDosDeviceA       (KERNEL32.182)
  */
 BOOL WINAPI DefineDosDeviceA(DWORD flags,LPCSTR devname,LPCSTR targetpath) {
-	FIXME_(dosfs)("(0x%08lx,%s,%s),stub!\n",flags,devname,targetpath);
+	FIXME("(0x%08lx,%s,%s),stub!\n",flags,devname,targetpath);
 	SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
 	return FALSE;
 }
