diff --git a/dlls/comctl32/animate.c b/dlls/comctl32/animate.c
index 7fb5c72..32a3a2e 100644
--- a/dlls/comctl32/animate.c
+++ b/dlls/comctl32/animate.c
@@ -17,7 +17,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "animate.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(animate)
 
@@ -109,38 +109,38 @@
     ANIMATE_Free (infoPtr);
 
     if (!lParam) {
-	TRACE (animate, "closing avi!\n");
+	TRACE("closing avi!\n");
 	return TRUE;
     }
     
     if (HIWORD(lParam)) {
-	FIXME (animate, "(\"%s\") empty stub!\n", (LPSTR)lParam);
+	FIXME("(\"%s\") empty stub!\n", (LPSTR)lParam);
 
 	if (ANIMATE_LoadResA (infoPtr, hInstance, (LPSTR)lParam)) {
 
-	    FIXME (animate, "AVI resource found!\n");
+	    FIXME("AVI resource found!\n");
 
 	}
 	else {
-	    FIXME (animate, "No AVI resource found!\n");
+	    FIXME("No AVI resource found!\n");
 	    if (ANIMATE_LoadFileA (infoPtr, (LPSTR)lParam)) {
-		FIXME (animate, "AVI file found!\n");
+		FIXME("AVI file found!\n");
 	    }
 	    else {
-		FIXME (animate, "No AVI file found!\n");
+		FIXME("No AVI file found!\n");
 		return FALSE;
 	    }
 	}
     }
     else {
-	FIXME (animate, "(%u) empty stub!\n", (WORD)LOWORD(lParam));
+	FIXME("(%u) empty stub!\n", (WORD)LOWORD(lParam));
 
 	if (ANIMATE_LoadResA (infoPtr, hInstance,
 				MAKEINTRESOURCEA((INT)lParam))) {
-	    FIXME (animate, "AVI resource found!\n");
+	    FIXME("AVI resource found!\n");
 	}
 	else {
-	    FIXME (animate, "No AVI resource found!\n");
+	    FIXME("No AVI resource found!\n");
 	    return FALSE;
 	}
     }
@@ -170,13 +170,13 @@
     
     if (nRepeat == -1) {
 
-	FIXME (animate, "(loop from=%d to=%d) empty stub!\n",
+	FIXME("(loop from=%d to=%d) empty stub!\n",
 	       nFrom, nTo);
 
     }
     else {
 
-	FIXME (animate, "(repeat=%d from=%d to=%d) empty stub!\n",
+	FIXME("(repeat=%d from=%d to=%d) empty stub!\n",
 	       nRepeat, nFrom, nTo);
 
     }
@@ -210,7 +210,7 @@
     /* allocate memory for info structure */
     infoPtr = (ANIMATE_INFO *)COMCTL32_Alloc (sizeof(ANIMATE_INFO));
     if (!infoPtr) {
-	ERR (animate, "could not allocate info memory!\n");
+	ERR("could not allocate info memory!\n");
 	return 0;
     }
 
@@ -296,7 +296,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (animate, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/comboex.c b/dlls/comctl32/comboex.c
index ba71c09..4c0021b 100644
--- a/dlls/comctl32/comboex.c
+++ b/dlls/comctl32/comboex.c
@@ -19,7 +19,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "comboex.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(comboex)
 
@@ -36,7 +36,7 @@
 {
     COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
 
-    TRACE (comboex, "\n");
+    TRACE("\n");
 
     return (LRESULT)infoPtr->hwndCombo;
 }
@@ -50,7 +50,7 @@
     if ((GetWindowLongA (hwnd, GWL_STYLE) & CBS_DROPDOWNLIST) != CBS_DROPDOWN)
 	return 0;
 
-    TRACE (comboex, "-- 0x%x\n", GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT));
+    TRACE("-- 0x%x\n", GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT));
 
     return (LRESULT)GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT);
 }
@@ -70,7 +70,7 @@
 {
     COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
 
-    TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+    TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
 
     return (LRESULT)infoPtr->himl;
 }
@@ -83,7 +83,7 @@
 {
     /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
 
-    FIXME (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+    FIXME("(0x%08x 0x%08lx)\n", wParam, lParam);
 
     return -1;
 }
@@ -96,7 +96,7 @@
     COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
     DWORD dwTemp;
 
-    TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+    TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
 
     dwTemp = infoPtr->dwExtStyle;
 
@@ -118,7 +118,7 @@
     COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
     HIMAGELIST himlTemp;
 
-    TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
+    TRACE("(0x%08x 0x%08lx)\n", wParam, lParam);
 
     himlTemp = infoPtr->himl;
     infoPtr->himl = (HIMAGELIST)lParam;
@@ -132,7 +132,7 @@
 {
     /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
 
-    FIXME (comboex, "(%p): stub\n", (LPVOID)lParam);
+    FIXME("(%p): stub\n", (LPVOID)lParam);
 
     return TRUE;
 }
@@ -146,7 +146,7 @@
 {
     COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
 
-    FIXME (comboex, "(0x%x 0x%x 0x%lx): stub\n", uMsg, wParam, lParam);
+    FIXME("(0x%x 0x%x 0x%lx): stub\n", uMsg, wParam, lParam);
 
     if (infoPtr->hwndCombo)    
 	return SendMessageA (infoPtr->hwndCombo, uMsg, wParam, lParam);
@@ -164,7 +164,7 @@
     /* allocate memory for info structure */
     infoPtr = (COMBOEX_INFO *)COMCTL32_Alloc (sizeof(COMBOEX_INFO));
     if (infoPtr == NULL) {
-	ERR (comboex, "could not allocate info memory!\n");
+	ERR("could not allocate info memory!\n");
 	return 0;
     }
 
@@ -298,7 +298,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (comboex, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/comctl32undoc.c b/dlls/comctl32/comctl32undoc.c
index 2536020..45ac8c8 100644
--- a/dlls/comctl32/comctl32undoc.c
+++ b/dlls/comctl32/comctl32undoc.c
@@ -20,7 +20,7 @@
 
 #include "winbase.h"
 #include "commctrl.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(commctrl)
 
@@ -59,7 +59,7 @@
     /* LPVOID *pWork1, *pWork2; */
     INT  nCount1, nCount2;
 
-    TRACE (commctrl, "(%p %p %08lx %p %p %08lx): stub!\n",
+    TRACE("(%p %p %08lx %p %p %08lx): stub!\n",
 	   hdpa1, hdpa2, dwFlags, pfnCompare, pfnParam5, lParam);
 
     if (IsBadWritePtr (hdpa1, sizeof(DPA)))
@@ -75,7 +75,7 @@
 	return FALSE;
 
     if (dwFlags & DPAM_SORT) {
-	TRACE (commctrl, "sorting dpa's!\n");
+	TRACE("sorting dpa's!\n");
 	DPA_Sort (hdpa1, pfnCompare, lParam);
 	DPA_Sort (hdpa2, pfnCompare, lParam);
     }
@@ -87,8 +87,8 @@
 
     nCount2 = hdpa2->nItemCount - 1;
 
-    FIXME (commctrl, "nCount1=%d nCount2=%d\n", nCount1, nCount2);
-    FIXME (commctrl, "semi stub!\n");
+    FIXME("nCount1=%d nCount2=%d\n", nCount1, nCount2);
+    FIXME("semi stub!\n");
 #if 0
 
     do {
@@ -132,11 +132,11 @@
 {
     LPVOID lpPtr;
 
-    TRACE (commctrl, "(0x%lx)\n", dwSize);
+    TRACE("(0x%lx)\n", dwSize);
 
     lpPtr = HeapAlloc (COMCTL32_hHeap, HEAP_ZERO_MEMORY, dwSize);
 
-    TRACE (commctrl, "-- ret=%p\n", lpPtr);
+    TRACE("-- ret=%p\n", lpPtr);
 
     return lpPtr;
 }
@@ -166,14 +166,14 @@
 {
     LPVOID lpDest;
 
-    TRACE (commctrl, "(%p 0x%08lx)\n", lpSrc, dwSize);
+    TRACE("(%p 0x%08lx)\n", lpSrc, dwSize);
 
     if (lpSrc)
 	lpDest = HeapReAlloc (COMCTL32_hHeap, HEAP_ZERO_MEMORY, lpSrc, dwSize);
     else
 	lpDest = HeapAlloc (COMCTL32_hHeap, HEAP_ZERO_MEMORY, dwSize);
 
-    TRACE (commctrl, "-- ret=%p\n", lpDest);
+    TRACE("-- ret=%p\n", lpDest);
 
     return lpDest;
 }
@@ -195,7 +195,7 @@
 BOOL WINAPI
 COMCTL32_Free (LPVOID lpMem)
 {
-    TRACE (commctrl, "(%p)\n", lpMem);
+    TRACE("(%p)\n", lpMem);
 
     return HeapFree (COMCTL32_hHeap, 0, lpMem);
 }
@@ -218,7 +218,7 @@
 DWORD WINAPI
 COMCTL32_GetSize (LPVOID lpMem)
 {
-    TRACE (commctrl, "(%p)\n", lpMem);
+    TRACE("(%p)\n", lpMem);
 
     return HeapSize (COMCTL32_hHeap, 0, lpMem);
 }
@@ -276,7 +276,7 @@
 DWORD WINAPI
 FreeMRUListA (HMRU hmru)
 {
-    FIXME (commctrl, "(%p) empty stub!\n", hmru);
+    FIXME("(%p) empty stub!\n", hmru);
 
 #if 0
     if (!(hmru->dwParam1 & 1001)) {
@@ -299,7 +299,7 @@
 AddMRUData (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3)
 {
 
-    FIXME (commctrl, "(%lx %lx %lx) empty stub!\n",
+    FIXME("(%lx %lx %lx) empty stub!\n",
 	   dwParam1, dwParam2, dwParam3);
 
     return 0;
@@ -310,7 +310,7 @@
 FindMRUData (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3, DWORD dwParam4)
 {
 
-    FIXME (commctrl, "(%lx %lx %lx %lx) empty stub!\n",
+    FIXME("(%lx %lx %lx %lx) empty stub!\n",
 	   dwParam1, dwParam2, dwParam3, dwParam4);
 
     return TRUE;
@@ -332,10 +332,10 @@
     /* internal variables */
     LPVOID ptr;
 
-    FIXME (commctrl, "(%p) empty stub!\n", lpmi);
+    FIXME("(%p) empty stub!\n", lpmi);
 
     if (lpmi) {
-	FIXME (commctrl, "(%lx %lx %lx %lx \"%s\" %lx)\n",
+	FIXME("(%lx %lx %lx %lx \"%s\" %lx)\n",
 	       lpmi->dwParam1, lpmi->dwParam2, lpmi->dwParam3,
 	       (DWORD)lpmi->hkeyMain, lpmi->lpszSubKey, lpmi->dwParam6);
     }
@@ -343,7 +343,7 @@
     /* dummy pointer creation */
     ptr = COMCTL32_Alloc (32);
 
-    FIXME (commctrl, "-- ret = %p\n", ptr);
+    FIXME("-- ret = %p\n", ptr);
 
     return ptr;
 }
@@ -367,7 +367,7 @@
 {
     INT len;
 
-    TRACE (commctrl, "(%p %p %d)\n", lpSrc, lpDest, nMaxLen);
+    TRACE("(%p %p %d)\n", lpSrc, lpDest, nMaxLen);
 
     if (!lpDest && lpSrc)
 	return lstrlenA (lpSrc);
@@ -404,7 +404,7 @@
 BOOL WINAPI
 Str_SetPtrA (LPSTR *lppDest, LPCSTR lpSrc)
 {
-    TRACE (commctrl, "(%p %p)\n", lppDest, lpSrc);
+    TRACE("(%p %p)\n", lppDest, lpSrc);
  
     if (lpSrc) {
 	LPSTR ptr = COMCTL32_ReAlloc (*lppDest, lstrlenA (lpSrc) + 1);
@@ -440,7 +440,7 @@
 {
     INT len;
 
-    TRACE (commctrl, "(%p %p %d)\n", lpSrc, lpDest, nMaxLen);
+    TRACE("(%p %p %d)\n", lpSrc, lpDest, nMaxLen);
 
     if (!lpDest && lpSrc)
 	return lstrlenW (lpSrc);
@@ -477,7 +477,7 @@
 BOOL WINAPI
 Str_SetPtrW (LPWSTR *lppDest, LPCWSTR lpSrc)
 {
-    TRACE (commctrl, "(%p %p)\n", lppDest, lpSrc);
+    TRACE("(%p %p)\n", lppDest, lpSrc);
  
     if (lpSrc) {
 	INT len = lstrlenW (lpSrc) + 1;
@@ -521,7 +521,7 @@
 {
     HDSA hdsa;
 
-    TRACE (commctrl, "(size=%d grow=%d)\n", nSize, nGrow);
+    TRACE("(size=%d grow=%d)\n", nSize, nGrow);
 
     hdsa = (HDSA)COMCTL32_Alloc (sizeof(DSA));
     if (hdsa)
@@ -551,7 +551,7 @@
 BOOL WINAPI
 DSA_Destroy (const HDSA hdsa)
 {
-    TRACE (commctrl, "(%p)\n", hdsa);
+    TRACE("(%p)\n", hdsa);
 
     if (!hdsa)
 	return FALSE;
@@ -581,7 +581,7 @@
 {
     LPVOID pSrc;
 
-    TRACE (commctrl, "(%p %d %p)\n", hdsa, nIndex, pDest);
+    TRACE("(%p %d %p)\n", hdsa, nIndex, pDest);
     
     if (!hdsa)
 	return FALSE;
@@ -614,7 +614,7 @@
 {
     LPVOID pSrc;
 
-    TRACE (commctrl, "(%p %d)\n", hdsa, nIndex);
+    TRACE("(%p %d)\n", hdsa, nIndex);
 
     if (!hdsa)
 	return NULL;
@@ -623,7 +623,7 @@
 
     pSrc = (char *) hdsa->pData + (hdsa->nItemSize * nIndex);
     
-    TRACE (commctrl, "-- ret=%p\n", pSrc);
+    TRACE("-- ret=%p\n", pSrc);
 
     return  pSrc;
 }
@@ -650,7 +650,7 @@
     INT  nSize, nNewItems;
     LPVOID pDest, lpTemp;
     
-    TRACE (commctrl, "(%p %d %p)\n", hdsa, nIndex, pSrc);
+    TRACE("(%p %d %p)\n", hdsa, nIndex, pSrc);
 
     if ((!hdsa) || nIndex < 0)
 	return FALSE;
@@ -679,7 +679,7 @@
 
     /* put the new entry in */
     pDest = (char *) hdsa->pData + (hdsa->nItemSize * nIndex);
-    TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+    TRACE("-- move dest=%p src=%p size=%d\n",
 	   pDest, pSrc, hdsa->nItemSize);
     memmove (pDest, pSrc, hdsa->nItemSize);
 
@@ -707,7 +707,7 @@
     LPVOID  lpTemp, lpDest;
     LPDWORD p;
     
-    TRACE(commctrl, "(%p %d %p)\n", hdsa, nIndex, pSrc);
+    TRACE("(%p %d %p)\n", hdsa, nIndex, pSrc);
 
     if ((!hdsa) || nIndex < 0)
 	return -1;
@@ -715,9 +715,9 @@
     for (i = 0; i < hdsa->nItemSize; i += 4) {
 	p = *(DWORD**)((char *) pSrc + i);
 	if (IsBadStringPtrA ((char*)p, 256))
-	    TRACE (commctrl, "-- %d=%p\n", i, (DWORD*)p);
+	    TRACE("-- %d=%p\n", i, (DWORD*)p);
 	else
-	    TRACE (commctrl, "-- %d=%p [%s]\n", i, p, debugstr_a((char*)p));
+	    TRACE("-- %d=%p [%s]\n", i, p, debugstr_a((char*)p));
     }
    
     /* when nIndex > nItemCount then append */
@@ -742,7 +742,7 @@
 	lpTemp = (char *) hdsa->pData + (hdsa->nItemSize * nIndex);
 	lpDest = (char *) lpTemp + hdsa->nItemSize;
 	nSize = (hdsa->nItemCount - nIndex) * hdsa->nItemSize;
-	TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+	TRACE("-- move dest=%p src=%p size=%d\n",
 	       lpDest, lpTemp, nSize);
 	memmove (lpDest, lpTemp, nSize);
     }
@@ -750,7 +750,7 @@
     /* ok, we can put the new Item in */
     hdsa->nItemCount++;
     lpDest = (char *) hdsa->pData + (hdsa->nItemSize * nIndex);
-    TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+    TRACE("-- move dest=%p src=%p size=%d\n",
 	   lpDest, pSrc, hdsa->nItemSize);
     memmove (lpDest, pSrc, hdsa->nItemSize);
 
@@ -776,7 +776,7 @@
     LPVOID lpDest,lpSrc;
     INT  nSize;
     
-    TRACE (commctrl, "(%p %d)\n", hdsa, nIndex);
+    TRACE("(%p %d)\n", hdsa, nIndex);
 
     if (!hdsa)
 	return -1;
@@ -788,7 +788,7 @@
 	lpDest = (char *) hdsa->pData + (hdsa->nItemSize * nIndex);
 	lpSrc = (char *) lpDest + hdsa->nItemSize;
 	nSize = hdsa->nItemSize * (hdsa->nItemCount - nIndex - 1);
-	TRACE (commctrl, "-- move dest=%p src=%p size=%d\n",
+	TRACE("-- move dest=%p src=%p size=%d\n",
 	       lpDest, lpSrc, nSize);
 	memmove (lpDest, lpSrc, nSize);
     }
@@ -827,7 +827,7 @@
 BOOL WINAPI
 DSA_DeleteAllItems (const HDSA hdsa)
 {
-    TRACE (commctrl, "(%p)\n", hdsa);
+    TRACE("(%p)\n", hdsa);
 
     if (!hdsa) 
 	return FALSE;
@@ -863,7 +863,7 @@
 {
     HDPA hdpa;
 
-    TRACE (commctrl, "(%d)\n", nGrow);
+    TRACE("(%d)\n", nGrow);
 
     hdpa = (HDPA)COMCTL32_Alloc (sizeof(DPA));
     if (hdpa) {
@@ -874,7 +874,7 @@
 	    (LPVOID*)COMCTL32_Alloc (hdpa->nMaxCount * sizeof(LPVOID));
     }
 
-    TRACE (commctrl, "-- %p\n", hdpa);
+    TRACE("-- %p\n", hdpa);
 
     return hdpa;
 }
@@ -894,7 +894,7 @@
 BOOL WINAPI
 DPA_Destroy (const HDPA hdpa)
 {
-    TRACE (commctrl, "(%p)\n", hdpa);
+    TRACE("(%p)\n", hdpa);
 
     if (!hdpa)
 	return FALSE;
@@ -923,7 +923,7 @@
 BOOL WINAPI
 DPA_Grow (const HDPA hdpa, INT nGrow)
 {
-    TRACE (commctrl, "(%p %d)\n", hdpa, nGrow);
+    TRACE("(%p %d)\n", hdpa, nGrow);
 
     if (!hdpa)
 	return FALSE;
@@ -963,7 +963,7 @@
     if (!hdpa)
 	return NULL;
 
-    TRACE (commctrl, "(%p %p)\n", hdpa, hdpaNew);
+    TRACE("(%p %p)\n", hdpa, hdpaNew);
 
     if (!hdpaNew) {
 	/* create a new DPA */
@@ -1017,7 +1017,7 @@
 LPVOID WINAPI
 DPA_GetPtr (const HDPA hdpa, INT i)
 {
-    TRACE (commctrl, "(%p %d)\n", hdpa, i);
+    TRACE("(%p %d)\n", hdpa, i);
 
     if (!hdpa)
 	return NULL;
@@ -1026,7 +1026,7 @@
     if ((i < 0) || (i >= hdpa->nItemCount))
 	return NULL;
 
-    TRACE (commctrl, "-- %p\n", hdpa->ptrs[i]);
+    TRACE("-- %p\n", hdpa->ptrs[i]);
 
     return hdpa->ptrs[i];
 }
@@ -1084,7 +1084,7 @@
     INT   nNewItems, nSize, nIndex = 0;
     LPVOID  *lpTemp, *lpDest;
 
-    TRACE (commctrl, "(%p %d %p)\n", hdpa, i, p);
+    TRACE("(%p %d %p)\n", hdpa, i, p);
 
     if ((!hdpa) || (i < 0))
 	return -1;
@@ -1100,7 +1100,7 @@
     }
     else {
 	if (hdpa->nItemCount >= hdpa->nMaxCount) {
-	    TRACE (commctrl, "-- resizing\n");
+	    TRACE("-- resizing\n");
 	    nNewItems = hdpa->nMaxCount + hdpa->nGrow;
 	    nSize = nNewItems * sizeof(LPVOID);
 
@@ -1114,14 +1114,14 @@
 
 	if (i >= hdpa->nItemCount) {
 	    nIndex = hdpa->nItemCount;
-	    TRACE (commctrl, "-- appending at %d\n", nIndex);
+	    TRACE("-- appending at %d\n", nIndex);
 	}
 	else {
-	    TRACE (commctrl, "-- inserting at %d\n", i);
+	    TRACE("-- inserting at %d\n", i);
 	    lpTemp = hdpa->ptrs + i;
 	    lpDest = lpTemp + 1;
 	    nSize  = (hdpa->nItemCount - i) * sizeof(LPVOID);
-	    TRACE (commctrl, "-- move dest=%p src=%p size=%x\n",
+	    TRACE("-- move dest=%p src=%p size=%x\n",
 		   lpDest, lpTemp, nSize);
 	    memmove (lpDest, lpTemp, nSize);
 	    nIndex = i;
@@ -1156,7 +1156,7 @@
 {
     LPVOID *lpTemp;
     
-    TRACE (commctrl, "(%p %d %p)\n", hdpa, i, p);
+    TRACE("(%p %d %p)\n", hdpa, i, p);
 
     if ((!hdpa) || i < 0)
 	return FALSE;
@@ -1210,7 +1210,7 @@
     LPVOID *lpDest, *lpSrc, lpTemp = NULL;
     INT  nSize;
     
-    TRACE (commctrl, "(%p %d)\n", hdpa, i);
+    TRACE("(%p %d)\n", hdpa, i);
 
     if ((!hdpa) || i < 0 || i >= hdpa->nItemCount)
 	return NULL;
@@ -1222,7 +1222,7 @@
 	lpDest = hdpa->ptrs + i;
 	lpSrc = lpDest + 1;
 	nSize = (hdpa->nItemCount - i - 1) * sizeof(LPVOID);
-	TRACE (commctrl,"-- move dest=%p src=%p size=%x\n",
+	TRACE("-- move dest=%p src=%p size=%x\n",
 	       lpDest, lpSrc, nSize);
 	memmove (lpDest, lpSrc, nSize);
     }
@@ -1262,7 +1262,7 @@
 BOOL WINAPI
 DPA_DeleteAllPtrs (const HDPA hdpa)
 {
-    TRACE (commctrl, "(%p)\n", hdpa);
+    TRACE("(%p)\n", hdpa);
 
     if (!hdpa) 
 	return FALSE;
@@ -1302,7 +1302,7 @@
     LPVOID t, v;
     INT  i, j;
 
-    TRACE (commctrl, "l=%i r=%i\n", l, r);
+    TRACE("l=%i r=%i\n", l, r);
  
     i = l;
     j = r;
@@ -1343,7 +1343,7 @@
     if (!hdpa || !pfnCompare)
 	return FALSE;
 
-    TRACE (commctrl, "(%p %p 0x%lx)\n", hdpa, pfnCompare, lParam);
+    TRACE("(%p %p 0x%lx)\n", hdpa, pfnCompare, lParam);
 
     if ((hdpa->nItemCount > 1) && (hdpa->ptrs))
 	DPA_QuickSort (hdpa->ptrs, 0, hdpa->nItemCount - 1,
@@ -1383,7 +1383,7 @@
     if (!hdpa || !pfnCompare || !pFind)
 	return -1;
 
-    TRACE (commctrl, "(%p %p %d %p 0x%08lx 0x%08x)\n",
+    TRACE("(%p %p %d %p 0x%08lx 0x%08x)\n",
 	   hdpa, pFind, nStart, pfnCompare, lParam, uOptions);
 
     if (uOptions & DPAS_SORTED) {
@@ -1391,7 +1391,7 @@
 	INT l, r, x, n;
 	LPVOID *lpPtr;
 
-	TRACE (commctrl, "binary search\n");
+	TRACE("binary search\n");
 
 	l = (nStart == -1) ? 0 : nStart;
 	r = hdpa->nItemCount - 1;
@@ -1404,18 +1404,18 @@
 	    else
 		l = x + 1;
 	    if (n == 0) {
-		TRACE (commctrl, "-- ret=%d\n", n);
+		TRACE("-- ret=%d\n", n);
 		return n;
 	    }
 	}
 
 	if (uOptions & DPAS_INSERTBEFORE) {
-	    TRACE (commctrl, "-- ret=%d\n", r);
+	    TRACE("-- ret=%d\n", r);
 	    return r;
 	}
 
 	if (uOptions & DPAS_INSERTAFTER) {
-	    TRACE (commctrl, "-- ret=%d\n", l);
+	    TRACE("-- ret=%d\n", l);
 	    return l;
 	}
     }
@@ -1424,19 +1424,19 @@
 	LPVOID *lpPtr;
 	INT  nIndex;
 
-	TRACE (commctrl, "linear search\n");
+	TRACE("linear search\n");
 	
 	nIndex = (nStart == -1)? 0 : nStart;
 	lpPtr = hdpa->ptrs;
 	for (; nIndex < hdpa->nItemCount; nIndex++) {
 	    if ((pfnCompare)(pFind, lpPtr[nIndex], lParam) == 0) {
-		TRACE (commctrl, "-- ret=%d\n", nIndex);
+		TRACE("-- ret=%d\n", nIndex);
 		return nIndex;
 	    }
 	}
     }
 
-    TRACE (commctrl, "-- not found: ret=-1\n");
+    TRACE("-- not found: ret=-1\n");
     return -1;
 }
 
@@ -1460,7 +1460,7 @@
 {
     HDPA hdpa;
 
-    TRACE (commctrl, "(%d 0x%x)\n", nGrow, hHeap);
+    TRACE("(%d 0x%x)\n", nGrow, hHeap);
 
     if (hHeap)
 	hdpa = (HDPA)HeapAlloc (hHeap, HEAP_ZERO_MEMORY, sizeof(DPA));
@@ -1476,7 +1476,7 @@
 				hdpa->nMaxCount * sizeof(LPVOID));
     }
 
-    TRACE (commctrl, "-- %p\n", hdpa);
+    TRACE("-- %p\n", hdpa);
 
     return hdpa;
 }
@@ -1508,7 +1508,7 @@
     LPNMHDR lpNmh = NULL;
     UINT idFrom = 0;
 
-    TRACE (commctrl, "(0x%04x 0x%04x %d %p 0x%08lx)\n",
+    TRACE("(0x%04x 0x%04x %d %p 0x%08lx)\n",
 	   lpNotify->hwndFrom, lpNotify->hwndTo, uCode, lpHdr,
 	   lpNotify->dwParam5);
 
@@ -1560,7 +1560,7 @@
 {
     NOTIFYDATA notify;
 
-    TRACE (commctrl, "(0x%04x 0x%04x %d %p)\n",
+    TRACE("(0x%04x 0x%04x %d %p)\n",
 	   hwndFrom, hwndTo, uCode, lpHdr);
 
     notify.hwndFrom = hwndFrom;
@@ -1594,7 +1594,7 @@
     NOTIFYDATA notify;
     HWND hwndNotify;
 
-    TRACE (commctrl, "(0x%04x 0x%04x %d %p 0x%08lx)\n",
+    TRACE("(0x%04x 0x%04x %d %p 0x%08lx)\n",
 	   hwndFrom, hwndTo, uCode, lpHdr, dwParam5);
 
     hwndNotify = hwndTo;
@@ -1690,7 +1690,7 @@
 {
     INT i;
 
-    TRACE (commctrl, "(%p %p %08lx)\n", hdpa, enumProc, lParam);
+    TRACE("(%p %p %08lx)\n", hdpa, enumProc, lParam);
 
     if (!hdpa)
 	return;
@@ -1724,7 +1724,7 @@
 BOOL WINAPI
 DPA_DestroyCallback (const HDPA hdpa, DPAENUMPROC enumProc, LPARAM lParam)
 {
-    TRACE (commctrl, "(%p %p %08lx)\n", hdpa, enumProc, lParam);
+    TRACE("(%p %p %08lx)\n", hdpa, enumProc, lParam);
 
     DPA_EnumCallback (hdpa, enumProc, lParam);
 
@@ -1751,7 +1751,7 @@
 {
     INT i;
 
-    TRACE (commctrl, "(%p %p %08lx)\n", hdsa, enumProc, lParam);
+    TRACE("(%p %p %08lx)\n", hdsa, enumProc, lParam);
 
     if (!hdsa)
 	return;
@@ -1786,7 +1786,7 @@
 BOOL WINAPI
 DSA_DestroyCallback (const HDSA hdsa, DSAENUMPROC enumProc, LPARAM lParam)
 {
-    TRACE (commctrl, "(%p %p %08lx)\n", hdsa, enumProc, lParam);
+    TRACE("(%p %p %08lx)\n", hdsa, enumProc, lParam);
 
     DSA_EnumCallback (hdsa, enumProc, lParam);
 
@@ -1884,7 +1884,7 @@
 
 DWORD WINAPI DPA_LoadStream(HDPA *hDpa, DWORD pfnDpaLoadCallback, DWORD param3, DWORD param4)
 {
-  FIXME(commctrl, "(%p %lx %lx %lx): partial stub!\n", hDpa, pfnDpaLoadCallback, param3, param4);
+  FIXME("(%p %lx %lx %lx): partial stub!\n", hDpa, pfnDpaLoadCallback, param3, param4);
 
  *hDpa = DPA_Create(8);
 
@@ -1899,7 +1899,7 @@
 
 DWORD WINAPI DPA_SaveStream(DWORD param1, DWORD param2, DWORD param3, DWORD param4)
 {
-  FIXME(commctrl, "(%lx %lx %lx %lx): stub!\n", param1, param2, param3, param4);
+  FIXME("(%lx %lx %lx %lx): stub!\n", param1, param2, param3, param4);
 
   return(0);
 }
diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c
index 6f530c6..f2526c2 100644
--- a/dlls/comctl32/commctrl.c
+++ b/dlls/comctl32/commctrl.c
@@ -29,7 +29,7 @@
 #include "trackbar.h"
 #include "treeview.h"
 #include "updown.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 
 DEFAULT_DEBUG_CHANNEL(commctrl)
@@ -57,7 +57,7 @@
 BOOL WINAPI
 COMCTL32_LibMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
-    TRACE (commctrl, "%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
+    TRACE("%x,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
 
     switch (fdwReason) {
 	case DLL_PROCESS_ATTACH:
@@ -68,11 +68,11 @@
 
 		/* create private heap */
 		COMCTL32_hHeap = HeapCreate (0, 0x10000, 0);
-		TRACE (commctrl, "Heap created: 0x%x\n", COMCTL32_hHeap);
+		TRACE("Heap created: 0x%x\n", COMCTL32_hHeap);
 
 		/* add global subclassing atom (used by 'tooltip' and 'updown') */
 		COMCTL32_aSubclass = (LPSTR)(DWORD)GlobalAddAtomA ("CC32SubclassInfo");
-		TRACE (commctrl, "Subclassing atom added: %p\n",
+		TRACE("Subclassing atom added: %p\n",
 		       COMCTL32_aSubclass);
 
 		/* register all Win95 common control classes */
@@ -120,13 +120,13 @@
 
 		/* delete global subclassing atom */
 		GlobalDeleteAtom (LOWORD(COMCTL32_aSubclass));
-		TRACE (commctrl, "Subclassing atom deleted: %p\n",
+		TRACE("Subclassing atom deleted: %p\n",
 		       COMCTL32_aSubclass);
 		COMCTL32_aSubclass = (LPSTR)NULL;
 
 		/* destroy private heap */
 		HeapDestroy (COMCTL32_hHeap);
-		TRACE (commctrl, "Heap destroyed: 0x%x\n", COMCTL32_hHeap);
+		TRACE("Heap destroyed: 0x%x\n", COMCTL32_hHeap);
 		COMCTL32_hHeap = (HANDLE)NULL;
 	    }
 	    break;
@@ -174,12 +174,12 @@
 
     switch (uMsg) {
 	case WM_MENUSELECT:
-	    TRACE (commctrl, "WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
+	    TRACE("WM_MENUSELECT wParam=0x%X lParam=0x%lX\n",
 		   wParam, lParam);
 
             if ((HIWORD(wParam) == 0xFFFF) && (lParam == 0)) {
                 /* menu was closed */
-		TRACE (commctrl, "menu was closed!\n");
+		TRACE("menu was closed!\n");
                 SendMessageA (hwndStatus, SB_SIMPLE, FALSE, 0);
             }
 	    else {
@@ -188,7 +188,7 @@
 		    uMenuID = (UINT)*(lpwIDs+1);
 		else
 		    uMenuID = (UINT)LOWORD(wParam);
-		TRACE (commctrl, "uMenuID = %u\n", uMenuID);
+		TRACE("uMenuID = %u\n", uMenuID);
 
 		if (uMenuID) {
 		    CHAR szText[256];
@@ -204,7 +204,7 @@
 	    break;
 
 	default:
-	    FIXME (commctrl, "Invalid Message 0x%x!\n", uMsg);
+	    FIXME("Invalid Message 0x%x!\n", uMsg);
 	    break;
     }
 }
@@ -245,7 +245,7 @@
 {
     LPINT lpMenuId;
 
-    TRACE (commctrl, "%x, %x, %p\n", hwnd, uFlags, lpInfo);
+    TRACE("%x, %x, %p\n", hwnd, uFlags, lpInfo);
 
     if (lpInfo == NULL)
 	return FALSE;
@@ -307,7 +307,7 @@
     INT  *lpRun;
     HWND hwndCtrl;
 
-    TRACE (commctrl, "(0x%08lx 0x%08lx 0x%08lx)\n",
+    TRACE("(0x%08lx 0x%08lx 0x%08lx)\n",
 	   (DWORD)hwnd, (DWORD)lpRect, (DWORD)lpInfo);
 
     GetClientRect (hwnd, lpRect);
@@ -320,7 +320,7 @@
 	lpRun++;
 	hwndCtrl = GetDlgItem (hwnd, *lpRun);
 	if (GetWindowLongA (hwndCtrl, GWL_STYLE) & WS_VISIBLE) {
-	    TRACE (commctrl, "control id 0x%x\n", *lpRun);
+	    TRACE("control id 0x%x\n", *lpRun);
 	    GetWindowRect (hwndCtrl, &rcCtrl);
 	    MapWindowPoints ((HWND)0, hwnd, (LPPOINT)&rcCtrl, 2);
 	    SubtractRect (lpRect, lpRect, &rcCtrl);
@@ -539,7 +539,7 @@
     if (lpInitCtrls->dwSize != sizeof(INITCOMMONCONTROLSEX))
 	return FALSE;
 
-    TRACE(commctrl,"(0x%08lx)\n", lpInitCtrls->dwICC);
+    TRACE("(0x%08lx)\n", lpInitCtrls->dwICC);
 
     for (cCount = 0; cCount < 32; cCount++) {
 	dwMask = 1 << cCount;
@@ -585,7 +585,7 @@
 		break;
 
 	    default:
-		FIXME (commctrl, "Unknown class! dwICC=0x%lX\n", dwMask);
+		FIXME("Unknown class! dwICC=0x%lX\n", dwMask);
 		break;
 	}
     }
@@ -819,7 +819,7 @@
 COMCTL32_DllGetVersion (DLLVERSIONINFO *pdvi)
 {
     if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
-        WARN (commctrl, "wrong DLLVERSIONINFO size from app");
+        WARN("wrong DLLVERSIONINFO size from app");
 	return E_INVALIDARG;
     }
 
@@ -828,7 +828,7 @@
     pdvi->dwBuildNumber = 3110;
     pdvi->dwPlatformID = 1;
 
-    TRACE (commctrl, "%lu.%lu.%lu.%lu\n",
+    TRACE("%lu.%lu.%lu.%lu\n",
 	   pdvi->dwMajorVersion, pdvi->dwMinorVersion,
 	   pdvi->dwBuildNumber, pdvi->dwPlatformID);
 
diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c
index 94d6be4..84da338 100644
--- a/dlls/comctl32/datetime.c
+++ b/dlls/comctl32/datetime.c
@@ -17,7 +17,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "datetime.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(datetime)
 
@@ -37,7 +37,7 @@
     /* allocate memory for info structure */
     infoPtr = (DATETIME_INFO *)COMCTL32_Alloc (sizeof(DATETIME_INFO));
     if (infoPtr == NULL) {
-	ERR (datetime, "could not allocate info memory!\n");
+	ERR("could not allocate info memory!\n");
 	return 0;
     }
 
@@ -73,47 +73,47 @@
     {
 
     case DTM_GETSYSTEMTIME:
-        FIXME (datetime, "Unimplemented msg DTM_GETSYSTEMTIME\n");
+        FIXME("Unimplemented msg DTM_GETSYSTEMTIME\n");
         return GDT_VALID;
 
     case DTM_SETSYSTEMTIME:
-        FIXME (datetime, "Unimplemented msg DTM_SETSYSTEMTIME\n");
+        FIXME("Unimplemented msg DTM_SETSYSTEMTIME\n");
         return 1;
 
     case DTM_GETRANGE:
-        FIXME (datetime, "Unimplemented msg DTM_GETRANGE\n");
+        FIXME("Unimplemented msg DTM_GETRANGE\n");
         return 0;
 
     case DTM_SETRANGE:
-        FIXME (datetime, "Unimplemented msg DTM_SETRANGE\n");
+        FIXME("Unimplemented msg DTM_SETRANGE\n");
         return 1;
 
     case DTM_SETFORMATA:
-        FIXME (datetime, "Unimplemented msg DTM_SETFORMAT32A\n");
+        FIXME("Unimplemented msg DTM_SETFORMAT32A\n");
         return 1;
 
     case DTM_SETFORMATW:
-        FIXME (datetime, "Unimplemented msg DTM_SETFORMAT32W\n");
+        FIXME("Unimplemented msg DTM_SETFORMAT32W\n");
         return 1;
 
     case DTM_SETMCCOLOR:
-        FIXME (datetime, "Unimplemented msg DTM_SETMCCOLOR\n");
+        FIXME("Unimplemented msg DTM_SETMCCOLOR\n");
         return 0;
 
     case DTM_GETMCCOLOR:
-        FIXME (datetime, "Unimplemented msg DTM_GETMCCOLOR\n");
+        FIXME("Unimplemented msg DTM_GETMCCOLOR\n");
         return 0;
 
     case DTM_GETMONTHCAL:
-        FIXME (datetime, "Unimplemented msg DTM_GETMONTHCAL\n");
+        FIXME("Unimplemented msg DTM_GETMONTHCAL\n");
         return 0;
 
     case DTM_SETMCFONT:
-        FIXME (datetime, "Unimplemented msg DTM_SETMCFONT\n");
+        FIXME("Unimplemented msg DTM_SETMCFONT\n");
         return 0;
 
     case DTM_GETMCFONT:
-        FIXME (datetime, "Unimplemented msg DTM_GETMCFONT\n");
+        FIXME("Unimplemented msg DTM_GETMCFONT\n");
         return 0;
 
 	case WM_CREATE:
@@ -124,7 +124,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (datetime, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/draglist.c b/dlls/comctl32/draglist.c
index 43fe498..d3958f9 100644
--- a/dlls/comctl32/draglist.c
+++ b/dlls/comctl32/draglist.c
@@ -13,14 +13,14 @@
  */
 
 #include "commctrl.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(commctrl)
 
 
 BOOL WINAPI MakeDragList (HWND hwndLB)
 {
-    FIXME (commctrl, "(0x%x)\n", hwndLB);
+    FIXME("(0x%x)\n", hwndLB);
 
 
     return FALSE;
@@ -29,7 +29,7 @@
 
 VOID WINAPI DrawInsert (HWND hwndParent, HWND hwndLB, INT nItem)
 {
-    FIXME (commctrl, "(0x%x 0x%x %d)\n", hwndParent, hwndLB, nItem);
+    FIXME("(0x%x 0x%x %d)\n", hwndParent, hwndLB, nItem);
 
 
 }
@@ -37,7 +37,7 @@
 
 INT WINAPI LBItemFromPt (HWND hwndLB, POINT pt, BOOL bAutoScroll)
 {
-    FIXME (commctrl, "(0x%x %ld x %ld %s)\n",
+    FIXME("(0x%x %ld x %ld %s)\n",
 	   hwndLB, pt.x, pt.y, bAutoScroll ? "TRUE" : "FALSE");
 
 
diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c
index 23b4182..97bd3e9 100644
--- a/dlls/comctl32/header.c
+++ b/dlls/comctl32/header.c
@@ -24,7 +24,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "header.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(header)
 
@@ -309,7 +309,7 @@
 	if (infoPtr->uNumItem == 0) {
 	    *pFlags |= HHT_NOWHERE;
 	    *pItem = 1;
-	    TRACE (header, "NOWHERE\n");
+	    TRACE("NOWHERE\n");
 	    return;
 	}
 	else {
@@ -325,7 +325,7 @@
 		    if (width <= 2 * DIVIDER_WIDTH) {
 			*pFlags |= HHT_ONHEADER;
 			*pItem = iCount;
-			TRACE (header, "ON HEADER %d\n", iCount);
+			TRACE("ON HEADER %d\n", iCount);
 			return;
 		    }
 		    if (iCount > 0) {
@@ -335,13 +335,13 @@
 			    if (bNoWidth) {
 				*pFlags |= HHT_ONDIVOPEN;
 				*pItem = iCount - 1;
-				TRACE (header, "ON DIVOPEN %d\n", *pItem);
+				TRACE("ON DIVOPEN %d\n", *pItem);
 				return;
 			    }
 			    else {
 				*pFlags |= HHT_ONDIVIDER;
 				*pItem = iCount - 1;
-				TRACE (header, "ON DIVIDER %d\n", *pItem);
+				TRACE("ON DIVIDER %d\n", *pItem);
 				return;
 			    }
 			}
@@ -351,13 +351,13 @@
 		    if (PtInRect (&rcTest, *lpPt)) {
 			*pFlags |= HHT_ONDIVIDER;
 			*pItem = iCount;
-			TRACE (header, "ON DIVIDER %d\n", *pItem);
+			TRACE("ON DIVIDER %d\n", *pItem);
 			return;
 		    }
 
 		    *pFlags |= HHT_ONHEADER;
 		    *pItem = iCount;
-		    TRACE (header, "ON HEADER %d\n", iCount);
+		    TRACE("ON HEADER %d\n", iCount);
 		    return;
 		}
 	    }
@@ -370,45 +370,45 @@
 		if (bNoWidth) {
 		    *pFlags |= HHT_ONDIVOPEN;
 		    *pItem = infoPtr->uNumItem - 1;
-		    TRACE (header, "ON DIVOPEN %d\n", *pItem);
+		    TRACE("ON DIVOPEN %d\n", *pItem);
 		    return;
 		}
 		else {
 		    *pFlags |= HHT_ONDIVIDER;
 		    *pItem = infoPtr->uNumItem-1;
-		    TRACE (header, "ON DIVIDER %d\n", *pItem);
+		    TRACE("ON DIVIDER %d\n", *pItem);
 		    return;
 		}
 	    }
 
 	    *pFlags |= HHT_NOWHERE;
 	    *pItem = 1;
-	    TRACE (header, "NOWHERE\n");
+	    TRACE("NOWHERE\n");
 	    return;
 	}
     }
     else {
 	if (lpPt->x < rect.left) {
-	   TRACE (header, "TO LEFT\n");
+	   TRACE("TO LEFT\n");
 	   *pFlags |= HHT_TOLEFT;
 	}
 	else if (lpPt->x > rect.right) {
-	    TRACE (header, "TO LEFT\n");
+	    TRACE("TO LEFT\n");
 	    *pFlags |= HHT_TORIGHT;
 	}
 
 	if (lpPt->y < rect.top) {
-	    TRACE (header, "ABOVE\n");
+	    TRACE("ABOVE\n");
 	    *pFlags |= HHT_ABOVE;
 	}
 	else if (lpPt->y > rect.bottom) {
-	    TRACE (header, "BELOW\n");
+	    TRACE("BELOW\n");
 	    *pFlags |= HHT_BELOW;
 	}
     }
 
     *pItem = 1;
-    TRACE (header, "flags=0x%X\n", *pFlags);
+    TRACE("flags=0x%X\n", *pFlags);
     return;
 }
 
@@ -495,7 +495,7 @@
 static LRESULT
 HEADER_CreateDragImage (HWND hwnd, WPARAM wParam)
 {
-    FIXME (header, "empty stub!\n");
+    FIXME("empty stub!\n");
     return 0;
 }
 
@@ -507,13 +507,13 @@
     INT iItem = (INT)wParam;
     HDC hdc;
 
-    TRACE(header, "[iItem=%d]\n", iItem);
+    TRACE("[iItem=%d]\n", iItem);
     
     if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem))
         return FALSE;
 
     if (infoPtr->uNumItem == 1) {
-        TRACE(header, "Simple delete!\n");
+        TRACE("Simple delete!\n");
         if (infoPtr->items[0].pszText)
             COMCTL32_Free (infoPtr->items[0].pszText);
         COMCTL32_Free (infoPtr->items);
@@ -522,7 +522,7 @@
     }
     else {
         HEADER_ITEM *oldItems = infoPtr->items;
-        TRACE(header, "Complex delete! [iItem=%d]\n", iItem);
+        TRACE("Complex delete! [iItem=%d]\n", iItem);
 
         if (infoPtr->items[iItem].pszText)
             COMCTL32_Free (infoPtr->items[iItem].pszText);
@@ -576,7 +576,7 @@
     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
         return FALSE;
 
-    TRACE (header, "[nItem=%d]\n", nItem);
+    TRACE("[nItem=%d]\n", nItem);
 
     if (phdi->mask == 0)
 	return TRUE;
@@ -624,7 +624,7 @@
     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
         return FALSE;
 
-    TRACE (header, "[nItem=%d]\n", nItem);
+    TRACE("[nItem=%d]\n", nItem);
 
     if (phdi->mask == 0)
 	return TRUE;
@@ -905,7 +905,7 @@
         lpLayout->pwpos->cy = infoPtr->nHeight;
     lpLayout->pwpos->flags = SWP_NOZORDER;
 
-    TRACE (header, "Layout x=%d y=%d cx=%d cy=%d\n",
+    TRACE("Layout x=%d y=%d cx=%d cy=%d\n",
            lpLayout->pwpos->x, lpLayout->pwpos->y,
            lpLayout->pwpos->cx, lpLayout->pwpos->cy);
 
@@ -950,7 +950,7 @@
     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
         return FALSE;
 
-    TRACE (header, "[nItem=%d]\n", nItem);
+    TRACE("[nItem=%d]\n", nItem);
 
     if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem))
 	return FALSE;
@@ -1015,7 +1015,7 @@
     if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
         return FALSE;
 
-    TRACE (header, "[nItem=%d]\n", nItem);
+    TRACE("[nItem=%d]\n", nItem);
 
     if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem))
 	return FALSE;
@@ -1198,7 +1198,7 @@
 	HEADER_RefreshItem (hwnd, hdc, nItem);
 	ReleaseDC (hwnd, hdc);
 
-	TRACE (header, "Pressed item %d!\n", nItem);
+	TRACE("Pressed item %d!\n", nItem);
     } 
     else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) {
 	if (!(HEADER_SendHeaderNotify (hwnd, HDN_BEGINTRACKA, nItem))) {
@@ -1216,7 +1216,7 @@
 		ReleaseDC (hwnd, hdc);
 	    }
 
-	    TRACE (header, "Begin tracking item %d!\n", nItem);
+	    TRACE("Begin tracking item %d!\n", nItem);
 	}
     }
 
@@ -1247,11 +1247,11 @@
 
 	    HEADER_SendClickNotify (hwnd, HDN_ITEMCLICKA, infoPtr->iMoveItem);
 	}
-	TRACE (header, "Released item %d!\n", infoPtr->iMoveItem);
+	TRACE("Released item %d!\n", infoPtr->iMoveItem);
 	infoPtr->bPressed = FALSE;
     }
     else if (infoPtr->bTracking) {
-	TRACE (header, "End tracking item %d!\n", infoPtr->iMoveItem);
+	TRACE("End tracking item %d!\n", infoPtr->iMoveItem);
 	infoPtr->bTracking = FALSE;
 
 	HEADER_SendHeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem);
@@ -1321,7 +1321,7 @@
 	    HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
 	    ReleaseDC (hwnd, hdc);
 
-	    TRACE (header, "Moving pressed item %d!\n", infoPtr->iMoveItem);
+	    TRACE("Moving pressed item %d!\n", infoPtr->iMoveItem);
 	}
 	else if (infoPtr->bTracking) {
 	    if (dwStyle & HDS_FULLDRAG) {
@@ -1353,12 +1353,12 @@
 	    }
 
 	    HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem);
-	    TRACE (header, "Tracking item %d!\n", infoPtr->iMoveItem);
+	    TRACE("Tracking item %d!\n", infoPtr->iMoveItem);
 	}
     }
 
     if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) {
-	FIXME (header, "hot track support!\n");
+	FIXME("hot track support!\n");
     }
 
     return 0;
@@ -1394,7 +1394,7 @@
     UINT  flags;
     INT   nItem;
 
-    TRACE (header, "code=0x%X  id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
+    TRACE("code=0x%X  id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
 
     GetCursorPos (&pt);
     ScreenToClient (hwnd, &pt);
@@ -1542,7 +1542,7 @@
 
         default:
             if (msg >= WM_USER) 
-		ERR (header, "unknown msg %04x wp=%04x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%04x lp=%08lx\n",
 		     msg, wParam, lParam );
 	    return DefWindowProcA (hwnd, msg, wParam, lParam);
     }
diff --git a/dlls/comctl32/hotkey.c b/dlls/comctl32/hotkey.c
index 8c79291..ecc6ab0 100644
--- a/dlls/comctl32/hotkey.c
+++ b/dlls/comctl32/hotkey.c
@@ -16,7 +16,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "hotkey.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(hotkey)
 
@@ -117,11 +117,11 @@
 	case VK_SHIFT:
 	case VK_CONTROL:
 	case VK_MENU:
-	    FIXME (hotkey, "modifier key pressed!\n");
+	    FIXME("modifier key pressed!\n");
 	    break;
 
 	default:
-	    FIXME (hotkey, " %d\n", wParam);
+	    FIXME(" %d\n", wParam);
 	    break;
     }
 
@@ -134,7 +134,7 @@
 {
     /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
 
-    FIXME (hotkey, " %d\n", wParam);
+    FIXME(" %d\n", wParam);
 
     return 0;
 }
@@ -217,7 +217,7 @@
 
     if (LOWORD(lParam)) {
 
-	FIXME (hotkey, "force redraw!\n");
+	FIXME("force redraw!\n");
 
     }
 
@@ -242,11 +242,11 @@
 	case VK_SHIFT:
 	case VK_CONTROL:
 	case VK_MENU:
-	    FIXME (hotkey, "modifier key pressed!\n");
+	    FIXME("modifier key pressed!\n");
 	    break;
 
 	default:
-	    FIXME (hotkey, " %d\n", wParam);
+	    FIXME(" %d\n", wParam);
 	    break;
     }
 
@@ -259,7 +259,7 @@
 {
     /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
 
-    FIXME (hotkey, " %d\n", wParam);
+    FIXME(" %d\n", wParam);
 
     return 0;
 }
@@ -321,7 +321,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (hotkey, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index 9fca3c3..810c615 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -34,7 +34,7 @@
 #include "wine/obj_storage.h"
 #include "imagelist.h"
 #include "commctrl.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(imagelist)
 
@@ -82,7 +82,7 @@
     HBITMAP hbmNewBitmap;
     INT     nNewWidth, nNewCount;
 
-    TRACE(imagelist, "Create expanded bitmaps!\n");
+    TRACE("Create expanded bitmaps!\n");
 
     nNewCount = himl->cCurImage + nImageCount + himl->cGrow;
     nNewWidth = nNewCount * himl->cx;
@@ -93,7 +93,7 @@
     hbmNewBitmap =
         CreateBitmap (nNewWidth, himl->cy, 1, himl->uBitsPixel, NULL);
     if (hbmNewBitmap == 0)
-        ERR (imagelist, "creating new image bitmap!\n");
+        ERR("creating new image bitmap!\n");
 
     SelectObject (hdcImageList, himl->hbmImage);
     SelectObject (hdcBitmap, hbmNewBitmap);
@@ -108,7 +108,7 @@
             CreateBitmap (nNewWidth, himl->cy, 1, 1, NULL);
 
         if (hbmNewBitmap == 0)
-            ERR (imagelist, "creating new mask bitmap!");
+            ERR("creating new mask bitmap!");
 
         SelectObject (hdcImageList, himl->hbmMask);
         SelectObject (hdcBitmap, hbmNewBitmap);
@@ -309,7 +309,7 @@
 {
     HDC hdcSrc, hdcDst;
 
-    FIXME(imagelist, "partially implemented!\n");
+    FIXME("partially implemented!\n");
 
     if (himlTrack == NULL)
 	return FALSE;
@@ -321,7 +321,7 @@
 	ImageList_Create (himlTrack->cx, himlTrack->cy,
 			  himlTrack->flags, 1, 1);
     if (himlInternalDrag == NULL) {
-        ERR(imagelist, "Error creating drag image list!\n");
+        ERR("Error creating drag image list!\n");
         return FALSE;
     }
 
@@ -381,7 +381,7 @@
 {
     HDC hdcSrc, hdcDst;    
 
-    TRACE(imagelist, "iDst=%d  iSrc=%d\n", iDst, iSrc);
+    TRACE("iDst=%d  iSrc=%d\n", iDst, iSrc);
 
     if ((himlSrc == NULL) || (himlDst == NULL))
 	return FALSE;
@@ -509,7 +509,7 @@
     static WORD aBitBlend50[] =
         {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
 
-    TRACE (imagelist, "(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow);
+    TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow);
 
     himl = (HIMAGELIST)COMCTL32_Alloc (sizeof(struct _IMAGELIST));
     if (!himl)
@@ -533,13 +533,13 @@
     himl->uBitsPixel = (UINT)GetDeviceCaps (hdc, BITSPIXEL);
     DeleteDC (hdc);
 
-    TRACE(imagelist, "Image: %d Bits per Pixel\n", himl->uBitsPixel);
+    TRACE("Image: %d Bits per Pixel\n", himl->uBitsPixel);
 
     himl->hbmImage =
         CreateBitmap (himl->cx * himl->cMaxImage, himl->cy,
                         1, himl->uBitsPixel, NULL);
     if (himl->hbmImage == 0) {
-        ERR(imagelist, "Error creating image bitmap!\n");
+        ERR("Error creating image bitmap!\n");
         return NULL;
     }
 
@@ -547,7 +547,7 @@
         himl->hbmMask = CreateBitmap (himl->cx * himl->cMaxImage, himl->cy,
 					1, 1, NULL);
         if (himl->hbmMask == 0) {
-            ERR(imagelist, "Error creating mask bitmap!\n");
+            ERR("Error creating mask bitmap!\n");
             if (himl->hbmImage)
                 DeleteObject (himl->hbmImage);
             return NULL;
@@ -732,8 +732,8 @@
 {
     HDC hdcDrag;
 
-    FIXME (imagelist, "semi-stub!\n");
-    TRACE (imagelist, "bShow=0x%X!\n", bShow);
+    FIXME("semi-stub!\n");
+    TRACE("bShow=0x%X!\n", bShow);
 
     hdcDrag = GetDCEx (hwndInternalDrag, 0,
 			 DCX_WINDOW | DCX_CACHE | DCX_LOCKWINDOWUPDATE);
@@ -1069,7 +1069,7 @@
     HDC hdcSrc, hdcDst;
 
     if (himlSrc == NULL) {
-        ERR (imagelist, "Invalid image list handle!\n");
+        ERR("Invalid image list handle!\n");
         return NULL;
     }
 
@@ -1120,7 +1120,7 @@
 BOOL WINAPI
 ImageList_EndDrag (void)
 {
-    FIXME (imagelist, "semi-stub!\n");
+    FIXME("semi-stub!\n");
 
     if (himlInternalDrag)
     {
@@ -1180,7 +1180,7 @@
 HIMAGELIST WINAPI
 ImageList_GetDragImage (POINT *ppt, POINT *pptHotspot)
 {
-    FIXME (imagelist, "semi-stub!\n");
+    FIXME("semi-stub!\n");
 
     if (himlInternalDrag)
         return (himlInternalDrag);
@@ -1409,7 +1409,7 @@
 
     handle = LoadImageA (hi, lpbmp, uType, 0, 0, uFlags);
     if (!handle) {
-        ERR (imagelist, "Error loading image!\n");
+        ERR("Error loading image!\n");
         return NULL;
     }
 
@@ -1473,7 +1473,7 @@
 
     handle = LoadImageW (hi, lpbmp, uType, 0, 0, uFlags);
     if (!handle) {
-        ERR (imagelist, "Error loading image!\n");
+        ERR("Error loading image!\n");
         return NULL;
     }
 
@@ -1539,12 +1539,12 @@
 
     /* check indices */
     if ((i1 < 0) || (i1 >= himl1->cCurImage)) {
-        ERR (imagelist, "Index 1 out of range! %d\n", i1);
+        ERR("Index 1 out of range! %d\n", i1);
         return NULL;
     }
 
     if ((i2 < 0) || (i2 >= himl2->cCurImage)) {
-        ERR (imagelist, "Index 2 out of range! %d\n", i2);
+        ERR("Index 2 out of range! %d\n", i2);
         return NULL;
     }
 
@@ -1646,7 +1646,7 @@
 
 HIMAGELIST WINAPI ImageList_Read (LPSTREAM pstm)
 {
-    FIXME (imagelist, "empty stub!\n");
+    FIXME("empty stub!\n");
 
 
     return NULL;
@@ -1673,18 +1673,18 @@
     INT     cxNew, nCount;
 
     if ((i < -1) || (i >= himl->cCurImage)) {
-        ERR (imagelist, "index out of range! %d\n", i);
+        ERR("index out of range! %d\n", i);
         return FALSE;
     }
 
     if (himl->cCurImage == 0) {
-        ERR (imagelist, "image list is already empty!\n");
+        ERR("image list is already empty!\n");
         return FALSE;
     }
 
     if (i == -1) {
         /* remove all */
-        TRACE (imagelist, "remove all!\n");
+        TRACE("remove all!\n");
 
         himl->cMaxImage = himl->cInitial + himl->cGrow;
         himl->cCurImage = 0;
@@ -1705,14 +1705,14 @@
     }
     else {
         /* delete one image */
-        TRACE (imagelist, "Remove single image! %d\n", i);
+        TRACE("Remove single image! %d\n", i);
 
         /* create new bitmap(s) */
         cxNew = (himl->cCurImage + himl->cGrow - 1) * himl->cx;
 
-        TRACE(imagelist, " - Number of images: %d / %d (Old/New)\n",
+        TRACE(" - Number of images: %d / %d (Old/New)\n",
                  himl->cCurImage, himl->cCurImage - 1);
-        TRACE(imagelist, " - Max. number of images: %d / %d (Old/New)\n",
+        TRACE(" - Max. number of images: %d / %d (Old/New)\n",
                  himl->cMaxImage, himl->cCurImage + himl->cGrow - 1);
         
         hbmNewImage =
@@ -1728,7 +1728,7 @@
 
         /* copy all images and masks prior to the "removed" image */
         if (i > 0) {
-            TRACE (imagelist, "Pre image copy: Copy %d images\n", i);
+            TRACE("Pre image copy: Copy %d images\n", i);
        
             SelectObject (hdcSrc, himl->hbmImage);
             SelectObject (hdcDst, hbmNewImage);
@@ -1745,7 +1745,7 @@
 
         /* copy all images and masks behind the removed image */
         if (i < himl->cCurImage - 1) {
-            TRACE (imagelist, "Post image copy!\n");
+            TRACE("Post image copy!\n");
             SelectObject (hdcSrc, himl->hbmImage);
             SelectObject (hdcDst, hbmNewImage);
             BitBlt (hdcDst, i * himl->cx, 0, (himl->cCurImage - i - 1) * himl->cx,
@@ -1803,12 +1803,12 @@
     BITMAP bmp;
 
     if (himl == NULL) {
-        ERR (imagelist, "Invalid image list handle!\n");
+        ERR("Invalid image list handle!\n");
         return FALSE;
     }
     
     if ((i >= himl->cCurImage) || (i < 0)) {
-        ERR (imagelist, "Invalid image index!\n");
+        ERR("Invalid image index!\n");
         return FALSE;
     }
 
@@ -1864,7 +1864,7 @@
     ICONINFO  ii;
     BITMAP  bmp;
 
-    TRACE (imagelist, "(0x%lx 0x%x 0x%x)\n", (DWORD)himl, i, hIcon);
+    TRACE("(0x%lx 0x%x 0x%x)\n", (DWORD)himl, i, hIcon);
 
     if (himl == NULL)
 	return -1;
@@ -1873,9 +1873,9 @@
 
     GetIconInfo (hIcon, &ii);
     if (ii.hbmMask == 0)
-	ERR (imagelist, "no mask!\n");
+	ERR("no mask!\n");
     if (ii.hbmColor == 0)
-	ERR (imagelist, "no color!\n");
+	ERR("no color!\n");
     GetObjectA (ii.hbmMask, sizeof(BITMAP), (LPVOID)&bmp);
 
     if (i == -1) {
@@ -1889,14 +1889,14 @@
         nIndex = i;
 
     hdcImageList = CreateCompatibleDC (0);
-    TRACE (imagelist, "hdcImageList=0x%x!\n", hdcImageList);
+    TRACE("hdcImageList=0x%x!\n", hdcImageList);
     if (hdcImageList == 0)
-	ERR (imagelist, "invalid hdcImageList!\n");
+	ERR("invalid hdcImageList!\n");
 
     hdcImage = CreateCompatibleDC (0);
-    TRACE (imagelist, "hdcImage=0x%x!\n", hdcImage);
+    TRACE("hdcImage=0x%x!\n", hdcImage);
     if (hdcImage == 0)
-	ERR (imagelist, "invalid hdcImage!\n");
+	ERR("invalid hdcImage!\n");
 
     hbmOldDst = SelectObject (hdcImageList, himl->hbmImage);
     SetTextColor( hdcImageList, RGB(0,0,0));
@@ -1981,12 +1981,12 @@
 {
     HIMAGELIST himlTemp;
 
-    FIXME (imagelist, "semi-stub!\n");
+    FIXME("semi-stub!\n");
 
     if (himlInternalDrag == NULL)
 	return FALSE;
 
-    TRACE (imagelist, " dxH=%d dyH=%d nX=%d nY=%d\n",
+    TRACE(" dxH=%d dyH=%d nX=%d nY=%d\n",
 	   dxHotspot, dyHotspot, nInternalDragHotspotX, nInternalDragHotspotY);
 
     himlTemp = ImageList_Merge (himlInternalDrag, 0, himlDrag, iDrag,
@@ -2024,7 +2024,7 @@
 BOOL WINAPI
 ImageList_SetFilter (HIMAGELIST himl, INT i, DWORD dwFilter)
 {
-    FIXME (imagelist, "(%p 0x%x 0x%lx):empty stub!\n",
+    FIXME("(%p 0x%x 0x%lx):empty stub!\n",
 	   himl, i, dwFilter);
 
     return FALSE;
@@ -2135,7 +2135,7 @@
 	himl->hbmImage = hbmNewBitmap;
     }
     else
-	ERR (imagelist, "Could not create new image bitmap !\n");
+	ERR("Could not create new image bitmap !\n");
 
     if (himl->hbmMask)
     {
@@ -2160,7 +2160,7 @@
             himl->hbmMask = hbmNewBitmap;
         }
         else
-            ERR (imagelist, "Could not create new mask bitmap!\n");
+            ERR("Could not create new mask bitmap!\n");
     }
 
     DeleteDC (hdcImageList);
@@ -2232,7 +2232,7 @@
     if (!himl)
 	return FALSE;
 
-    FIXME (imagelist, "empty stub!\n");
+    FIXME("empty stub!\n");
 
     return FALSE;
 }
diff --git a/dlls/comctl32/ipaddress.c b/dlls/comctl32/ipaddress.c
index b481ff1..9042b74 100644
--- a/dlls/comctl32/ipaddress.c
+++ b/dlls/comctl32/ipaddress.c
@@ -27,7 +27,7 @@
 #include "commctrl.h"
 #include "ipaddress.h"
 #include "heap.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(ipaddress)
 
@@ -112,7 +112,7 @@
 					(HANDLE)lpipsi);
 /*		infoPtr->lpipsi= lpipsi; */
 	} else 
-		WARN (ipaddress,"IP-create called twice\n");
+		WARN("IP-create called twice\n");
 	
 	for (i=0; i<=3; i++) {
 		infoPtr->LowerLimit[i]=0;
@@ -159,7 +159,7 @@
 {
     HDC hdc;
 
-	TRACE (ipaddress,"\n");
+	TRACE("\n");
     hdc = GetDC (hwnd);
     IPADDRESS_Refresh (hwnd, hdc);
     ReleaseDC (hwnd, hdc);
@@ -191,7 +191,7 @@
 {
     HDC hdc;
 
-	TRACE (ipaddress,"\n");
+	TRACE("\n");
 
     hdc = GetDC (hwnd);
     IPADDRESS_Refresh (hwnd, hdc);
@@ -205,7 +205,7 @@
 IPADDRESS_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     /* IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd); */
-	TRACE (ipaddress,"\n");
+	TRACE("\n");
     return 0;
 }
 
@@ -214,7 +214,7 @@
 IPADDRESS_SendNotify (HWND hwnd, UINT command)
 
 {
-    TRACE (ipaddress, "%x\n",command);
+    TRACE("%x\n",command);
     return (BOOL)SendMessageA (GetParent (hwnd), WM_COMMAND,
               MAKEWPARAM (GetWindowLongA (hwnd, GWL_ID),command), (LPARAM)hwnd);
 }
@@ -225,7 +225,7 @@
 {
 	NMIPADDRESS nmip;
 
-    TRACE (ipaddress, "%x %x\n",field,newValue);
+    TRACE("%x %x\n",field,newValue);
     nmip.hdr.hwndFrom = hwnd;
     nmip.hdr.idFrom   = GetWindowLongA (hwnd, GWL_ID);
     nmip.hdr.code     = IPN_FIELDCHANGED;
@@ -249,7 +249,7 @@
 	LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
             GetPropA ((HWND)hwnd,IP_SUBCLASS_PROP);
 
-	TRACE (ipaddress,"\n");
+	TRACE("\n");
 
 	buf[0]=0;
 	for (i=0; i<=3; i++) 
@@ -270,7 +270,7 @@
  LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
             GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
 
- TRACE (ipaddress,"\n");
+ TRACE("\n");
 
  for (i=0; i<=3; i++) {
 		GetWindowTextA (lpipsi->hwndIP[i],buf,5);
@@ -291,7 +291,7 @@
  LPIP_SUBCLASS_INFO lpipsi=(LPIP_SUBCLASS_INFO)
             GetPropA ((HWND)hwnd, IP_SUBCLASS_PROP);
 
- TRACE (ipaddress,"\n");
+ TRACE("\n");
 
  valid=0;
  ip_addr=0;
@@ -322,7 +322,7 @@
     IPADDRESS_INFO *infoPtr = IPADDRESS_GetInfoPtr (hwnd);
 	INT index;
 	
- 	TRACE (ipaddress,"\n");
+ 	TRACE("\n");
 
 	index=(INT) wParam;
 	if ((index<0) || (index>3)) return 0;
@@ -342,7 +342,7 @@
 	int i,ip_address,value;
     char buf[20];
 
- 	TRACE (ipaddress,"\n");
+ 	TRACE("\n");
 	ip_address=(DWORD) lParam;
 
 	for (i=3; i>=0; i--) {
@@ -375,7 +375,7 @@
 	INT index;
 
 	index=(INT) wParam;
- 	TRACE (ipaddress," %d\n", index);
+ 	TRACE(" %d\n", index);
 	if ((index<0) || (index>3)) return 0;
 	
 	SetFocus (lpipsi->hwndIP[index]);
@@ -387,7 +387,7 @@
 static LRESULT
 IPADDRESS_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
-    TRACE (ipaddress, "\n");
+    TRACE("\n");
 
 	SetFocus (hwnd);
 	IPADDRESS_SendNotify (hwnd, EN_SETFOCUS);
@@ -414,7 +414,7 @@
  char field[20];
  IPADDRESS_INFO *infoPtr=lpipsi->infoPtr;
 
- TRACE (ipaddress,"\n");
+ TRACE("\n");
  GetWindowTextA (lpipsi->hwndIP[currentfield],field,4);
  if (field[0]) {
 	field[3]=0;	
@@ -545,7 +545,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (ipaddress, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 3452f74..4232501 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -44,7 +44,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "listview.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(listview)
 
@@ -313,42 +313,42 @@
 {
   if ((LVS_TYPEMASK & lStyle) == LVS_EDITLABELS)
   {
-    FIXME( listview, "  LVS_EDITLABELS\n");
+    FIXME("  LVS_EDITLABELS\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_NOLABELWRAP)
   {
-    FIXME( listview, "  LVS_NOLABELWRAP\n");
+    FIXME("  LVS_NOLABELWRAP\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_NOSCROLL)
   {
-    FIXME( listview, "  LVS_NOSCROLL\n");
+    FIXME("  LVS_NOSCROLL\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_NOSORTHEADER)
   {
-    FIXME( listview, "  LVS_NOSORTHEADER\n");
+    FIXME("  LVS_NOSORTHEADER\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_OWNERDRAWFIXED)
   {
-    FIXME( listview, "  LVS_OWNERDRAWFIXED\n");
+    FIXME("  LVS_OWNERDRAWFIXED\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_SHAREIMAGELISTS)
   {
-    FIXME( listview, "  LVS_SHAREIMAGELISTS\n");
+    FIXME("  LVS_SHAREIMAGELISTS\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_SORTASCENDING)
   {
-    FIXME( listview, "  LVS_SORTASCENDING\n");
+    FIXME("  LVS_SORTASCENDING\n");
   }
 
   if ((LVS_TYPEMASK & lStyle) == LVS_SORTDESCENDING)
   {
-    FIXME( listview, "  LVS_SORTDESCENDING\n");
+    FIXME("  LVS_SORTDESCENDING\n");
   }
 }
 
@@ -483,7 +483,7 @@
   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)GetWindowLongA(hwnd, 0);
   BOOL bResult = FALSE;
 
-  TRACE(listview, "(hwnd=%x, left=%d, top=%d, right=%d, bottom=%d)\n", hwnd, 
+  TRACE("(hwnd=%x, left=%d, top=%d, right=%d, bottom=%d)\n", hwnd, 
         lprcView->left, lprcView->top, lprcView->right, lprcView->bottom);
   
   if (lprcView != NULL)
@@ -516,7 +516,7 @@
   BOOL bResult = FALSE;
   POINT ptOrigin;
 
-  TRACE(listview, "(hwnd=%x, lprcView=%p)\n", hwnd, lprcView);
+  TRACE("(hwnd=%x, lprcView=%p)\n", hwnd, lprcView);
 
   if (lprcView != NULL)
   {
@@ -529,7 +529,7 @@
       lprcView->bottom = infoPtr->rcView.bottom + ptOrigin.y;
     }
 
-    TRACE(listview, "(left=%d, top=%d, right=%d, bottom=%d)\n", 
+    TRACE("(left=%d, top=%d, right=%d, bottom=%d)\n", 
           lprcView->left, lprcView->top, lprcView->right, lprcView->bottom);
   }
 
@@ -590,7 +590,7 @@
   INT nLabelWidth;
   INT i;
 
-  TRACE(listview, "(hwnd=%x)\n", hwnd);
+  TRACE("(hwnd=%x)\n", hwnd);
 
   if (uView == LVS_ICON)
   {
@@ -1683,7 +1683,7 @@
   CHAR szDispText[DISP_TEXT_SIZE];
   LVITEMA lvItem;
 
-  TRACE(listview, "(hwnd=%x, hdc=%x, nItem=%d, nSubItem=%d\n", hwnd, hdc, 
+  TRACE("(hwnd=%x, hdc=%x, nItem=%d, nSubItem=%d\n", hwnd, hdc, 
         nItem, nSubItem);
 
   /* get information needed for drawing the item */
@@ -1727,7 +1727,7 @@
   DWORD dwBkColor;
   DWORD dwTextColor;
 
-  TRACE(listview, "(hwnd=%x, hdc=%x, nItem=%d\n", hwnd, hdc, nItem);
+  TRACE("(hwnd=%x, hdc=%x, nItem=%d\n", hwnd, hdc, nItem);
 
   /* get information needed for drawing the item */
   ZeroMemory(&lvItem, sizeof(LVITEMA));
@@ -1842,7 +1842,7 @@
   TEXTMETRICA tm;
   LVITEMA lvItem;
 
-  TRACE(listview, "(hwnd=%x, hdc=%x, nItem=%d, left=%d, top=%d, right=%d, \
+  TRACE("(hwnd=%x, hdc=%x, nItem=%d, left=%d, top=%d, right=%d, \
 bottom=%d)\n", hwnd, hdc, nItem, rcItem.left, rcItem.top, rcItem.right, 
         rcItem.bottom);
 
@@ -2361,7 +2361,7 @@
   INT j;
   HDPA hdpaSubItems;
 
-  TRACE(listview, "(hwnd=%x,)\n", hwnd);
+  TRACE("(hwnd=%x,)\n", hwnd);
 
   if (GETITEMCOUNT(infoPtr) > 0)
   {
@@ -2513,7 +2513,7 @@
   LISTVIEW_SUBITEM *lpSubItem;
   INT i;
 
-  TRACE(listview, "(hwnd=%x,nItem=%d)\n", hwnd, nItem);
+  TRACE("(hwnd=%x,nItem=%d)\n", hwnd, nItem);
 
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
   {
@@ -3237,7 +3237,7 @@
   LISTVIEW_ITEM *lpItem;
   HDPA hdpaSubItems;
 
-  TRACE(listview, "(hwnd=%x, lpLVItem=%p)\n", hwnd, lpLVItem);
+  TRACE("(hwnd=%x, lpLVItem=%p)\n", hwnd, lpLVItem);
 
   if (lpLVItem != NULL)
   {
@@ -3455,7 +3455,7 @@
   INT nCountPerColumn;
   INT nRow;
 
-  TRACE(listview, "(hwnd=%x,nItem=%d,lpptPosition=%p)\n", hwnd, nItem, 
+  TRACE("(hwnd=%x,nItem=%d,lpptPosition=%p)\n", hwnd, nItem, 
         lpptPosition);
 
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)) && 
@@ -3538,7 +3538,7 @@
   INT nLabelWidth;
   TEXTMETRICA tm;
 
-  TRACE(listview, "(hwnd=%x, nItem=%d, lprc=%p)\n", hwnd, nItem, lprc);
+  TRACE("(hwnd=%x, nItem=%d, lprc=%p)\n", hwnd, nItem, lprc);
   
   if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)) && (lprc != NULL))
   {
@@ -3824,7 +3824,7 @@
   INT nLabelWidth = 0;
   LVITEMA lvItem;
 
-  TRACE(listview, "(hwnd=%x, nItem=%d)\n", hwnd, nItem);
+  TRACE("(hwnd=%x, nItem=%d)\n", hwnd, nItem);
 
   ZeroMemory(&lvItem, sizeof(LVITEMA));
   lvItem.mask = LVIF_TEXT;
@@ -4106,7 +4106,7 @@
   INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
   BOOL bResult = FALSE;
   
-  TRACE(listview, "(hwnd=%x, lpptOrigin=%p)\n", hwnd, lpptOrigin);
+  TRACE("(hwnd=%x, lpptOrigin=%p)\n", hwnd, lpptOrigin);
 
   if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
   {
@@ -4267,7 +4267,7 @@
   RECT rcItem;
   INT i;
   
-  TRACE(listview,"(hwnd=%x, x=%ld, y=%ld)\n", hwnd, lpHitTestInfo->pt.x,
+  TRACE("(hwnd=%x, x=%ld, y=%ld)\n", hwnd, lpHitTestInfo->pt.x,
         lpHitTestInfo->pt.y);
 
   for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
@@ -4378,7 +4378,7 @@
   HDITEMA hdi;
   INT nNewColumn = -1;
 
-  TRACE(listview,"(hwnd=%x, nColumn=%d, lpColumn=%p)\n",hwnd, nColumn, 
+  TRACE("(hwnd=%x, nColumn=%d, lpColumn=%p)\n",hwnd, nColumn, 
         lpColumn);
 
   if (lpColumn != NULL) 
@@ -4492,7 +4492,7 @@
   HDPA hdpaSubItems;
   LISTVIEW_ITEM *lpItem = NULL;
 
-  TRACE(listview, "(hwnd=%x,lpLVItem=%p)\n", hwnd, lpLVItem);
+  TRACE("(hwnd=%x,lpLVItem=%p)\n", hwnd, lpLVItem);
 
   if (lpLVItem != NULL)
   {
@@ -4892,7 +4892,7 @@
  */
 static VOID LISTVIEW_SetItemCount(HWND hwnd, INT nItemCount)
 {
-  FIXME (listview, "empty stub!\n");
+  FIXME("empty stub!\n");
 }
 
 /***
@@ -4918,7 +4918,7 @@
   HDPA hdpaSubItems;
   BOOL bResult = FALSE;
 
-  TRACE(listview, "(hwnd=%x,nItem=%d,X=%d,Y=%d)\n", hwnd, nItem, nPosX, nPosY);
+  TRACE("(hwnd=%x,nItem=%d,X=%d,Y=%d)\n", hwnd, nItem, nPosX, nPosY);
 
   if ((nItem >= 0) || (nItem < GETITEMCOUNT(infoPtr)))
   {
@@ -5081,7 +5081,7 @@
  */
 static LRESULT LISTVIEW_SortItems(HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
-  FIXME (listview, "empty stub!\n");
+  FIXME("empty stub!\n");
 
   return TRUE;
 }
@@ -5152,7 +5152,7 @@
                                        (WPARAM)hwnd, (LPARAM)NF_QUERY);
   if (infoPtr->notifyFormat != NFR_ANSI)
   {
-    FIXME (listview, "ANSI notify format is NOT used\n");
+    FIXME("ANSI notify format is NOT used\n");
   }
   
   /* initialize color information  */
@@ -5640,7 +5640,7 @@
   LONG nCtrlId = GetWindowLongA(hwnd, GWL_ID);
   NMHDR nmh;
 
-  TRACE(listview, "(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
 
   /* send NM_DBLCLK notification */
   nmh.hwndFrom = hwnd;
@@ -5679,7 +5679,7 @@
   NMHDR nmh;
   INT nItem;
 
-  TRACE(listview, "(hwnd=%x, key=%hu, X=%hu, Y=%hu)\n", hwnd, wKey, wPosX, 
+  TRACE("(hwnd=%x, key=%hu, X=%hu, Y=%hu)\n", hwnd, wKey, wPosX, 
         wPosY);
 
   /* send NM_RELEASEDCAPTURE notification */ 
@@ -5761,7 +5761,7 @@
 {
   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0);
 
-  TRACE(listview, "(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
 
   if (infoPtr->bLButtonDown != FALSE) 
   {
@@ -5797,20 +5797,20 @@
 {
   LISTVIEW_INFO *infoPtr;
 
-  TRACE(listview, "(hwnd=%x,wParam=%x,lParam=%lx)\n", hwnd, wParam, lParam);
+  TRACE("(hwnd=%x,wParam=%x,lParam=%lx)\n", hwnd, wParam, lParam);
 
   /* allocate memory for info structure */
   infoPtr = (LISTVIEW_INFO *)COMCTL32_Alloc(sizeof(LISTVIEW_INFO));
   SetWindowLongA(hwnd, 0, (LONG)infoPtr);
   if (infoPtr == NULL) 
   {
-    ERR(listview, "could not allocate info memory!\n");
+    ERR("could not allocate info memory!\n");
     return 0;
   }
 
   if ((LISTVIEW_INFO *)GetWindowLongA(hwnd, 0) != infoPtr) 
   {
-    ERR(listview, "pointer assignment error!\n");
+    ERR("pointer assignment error!\n");
     return 0;
   }
 
@@ -5831,7 +5831,7 @@
 {
   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0);
 
-  TRACE(listview, "(hwnd=%x)\n", hwnd);
+  TRACE("(hwnd=%x)\n", hwnd);
 
   /* delete all items */
   LISTVIEW_DeleteAllItems(hwnd);
@@ -5904,7 +5904,7 @@
                                          (WPARAM)hwnd, (LPARAM)NF_QUERY);
     if (infoPtr->notifyFormat == NFR_UNICODE)
     {
-      FIXME (listview, "NO support for unicode structures");
+      FIXME("NO support for unicode structures");
     }
   }
 
@@ -5926,7 +5926,7 @@
 {
   PAINTSTRUCT ps;
 
-   TRACE(listview, "(hwnd=%x,hdc=%x)\n", hwnd, hdc);
+   TRACE("(hwnd=%x,hdc=%x)\n", hwnd, hdc);
 
   if (hdc == 0)
   {
@@ -5961,7 +5961,7 @@
   INT nCtrlId = GetWindowLongA(hwnd, GWL_ID);
   NMHDR nmh;
 
-  TRACE(listview, "(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
 
   /* send NM_RELEASEDCAPTURE notification */ 
   nmh.hwndFrom = hwnd;
@@ -5998,7 +5998,7 @@
   NMHDR nmh;
   INT nItem;
 
-  TRACE(listview, "(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
 
   /* send NM_RELEASEDCAPTURE notification */
   nmh.hwndFrom = hwnd;
@@ -6054,7 +6054,7 @@
   INT nCtrlId = GetWindowLongA(hwnd, GWL_ID);
   NMHDR nmh;
 
-  TRACE(listview, "(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
+  TRACE("(hwnd=%x,key=%hu,X=%hu,Y=%hu)\n", hwnd, wKey, wPosX, wPosY);
 
   if (infoPtr->bRButtonDown != FALSE) 
   {
@@ -6118,7 +6118,7 @@
   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0);
   UINT uView = GetWindowLongA(hwnd, GWL_STYLE) & LVS_TYPEMASK;
 
-  TRACE(listview, "(hwnd=%x,hfont=%x,redraw=%hu)\n", hwnd, hFont, fRedraw);
+  TRACE("(hwnd=%x,hfont=%x,redraw=%hu)\n", hwnd, hFont, fRedraw);
 
   if (hFont == 0)
   {
@@ -6165,7 +6165,7 @@
   LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE); 
   UINT uView = lStyle & LVS_TYPEMASK;
 
-  TRACE(listview, "(hwnd=%x, width=%d, height=%d)\n",hwnd, Width, Height);
+  TRACE("(hwnd=%x, width=%d, height=%d)\n",hwnd, Width, Height);
 
   LISTVIEW_UpdateSize(hwnd);
 
@@ -6258,7 +6258,7 @@
   UINT uOldView = lpss->styleOld & LVS_TYPEMASK;
   RECT rcList = infoPtr->rcList;
 
-  TRACE(listview, "(hwnd=%x, styletype=%x, stylestruct=%p)\n", 
+  TRACE("(hwnd=%x, styletype=%x, stylestruct=%p)\n", 
         hwnd, wStyleType, lpss);
 
   if (wStyleType == GWL_STYLE)
@@ -6664,7 +6664,7 @@
   default:
     if (uMsg >= WM_USER)
     {
-      ERR(listview, "unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, 
+      ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, 
           lParam);
     }
 
diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c
index ce7aea5..83a226f 100644
--- a/dlls/comctl32/monthcal.c
+++ b/dlls/comctl32/monthcal.c
@@ -17,7 +17,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "monthcal.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(monthcal)
 
@@ -81,7 +81,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (monthcal, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/nativefont.c b/dlls/comctl32/nativefont.c
index ae1eea0..4bfa5f6 100644
--- a/dlls/comctl32/nativefont.c
+++ b/dlls/comctl32/nativefont.c
@@ -16,7 +16,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "nativefont.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(nativefont)
 
@@ -72,7 +72,7 @@
 	    return NATIVEFONT_Destroy (hwnd, wParam, lParam);
 
 	default:
-	    ERR (nativefont, "unknown msg %04x wp=%08x lp=%08lx\n",
+	    ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/pager.c b/dlls/comctl32/pager.c
index 8024ee7..e7b3915 100644
--- a/dlls/comctl32/pager.c
+++ b/dlls/comctl32/pager.c
@@ -16,7 +16,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "pager.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(pager)
 
@@ -67,7 +67,7 @@
 {
     /* PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd); */
 
-    FIXME (pager, "empty stub!\n");
+    FIXME("empty stub!\n");
 
     return PGF_INVISIBLE;
 }
@@ -104,7 +104,7 @@
 	infoPtr->nChildSize = (dwStyle & PGS_HORZ) ? nmpgcs.iWidth : nmpgcs.iHeight;
 
 
-        FIXME (pager, "Child size %d\n", infoPtr->nChildSize);
+        FIXME("Child size %d\n", infoPtr->nChildSize);
 
 
     }
@@ -149,7 +149,7 @@
 
     infoPtr->nButtonSize = (INT)lParam;
 
-    FIXME (pager, "size=%d\n", infoPtr->nButtonSize);
+    FIXME("size=%d\n", infoPtr->nButtonSize);
 
     /* FIXME: redraw */
 
@@ -164,7 +164,7 @@
 
     infoPtr->hwndChild = IsWindow ((HWND)lParam) ? (HWND)lParam : 0;
 
-    FIXME (pager, "hwnd=%x\n", infoPtr->hwndChild);
+    FIXME("hwnd=%x\n", infoPtr->hwndChild);
 
     /* FIXME: redraw */
     if (infoPtr->hwndChild) {
@@ -184,7 +184,7 @@
 
     infoPtr->nPos = (INT)lParam;
 
-    FIXME (pager, "pos=%d\n", infoPtr->nPos);
+    FIXME("pos=%d\n", infoPtr->nPos);
 
     /* FIXME: redraw */
     SetWindowPos (infoPtr->hwndChild, HWND_TOP,
@@ -251,7 +251,7 @@
 {
     /* PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd); */
 
-    TRACE (pager, "stub!\n");
+    TRACE("stub!\n");
 
     return 0;
 }
@@ -349,7 +349,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (pager, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/progress.c b/dlls/comctl32/progress.c
index ee797f1..2ef35de 100644
--- a/dlls/comctl32/progress.c
+++ b/dlls/comctl32/progress.c
@@ -9,7 +9,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "progress.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(progress)
 
@@ -20,7 +20,7 @@
 
 /* Work constants */
 
-#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(progress, \
+#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(\
         "Unknown parameter(s) for message " #msg     \
 	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam); 
 
@@ -40,7 +40,7 @@
   RECT rect;
   DWORD dwStyle;
 
-  TRACE(progress, "refresh pos=%d min=%d, max=%d\n",
+  TRACE("refresh pos=%d min=%d, max=%d\n",
 	       infoPtr->CurVal, infoPtr->MinVal, infoPtr->MaxVal);
 
   /* get the required bar brush */
@@ -223,11 +223,11 @@
       infoPtr->ColorBar=CLR_DEFAULT;
       infoPtr->ColorBk=CLR_DEFAULT;
       infoPtr->hFont=(HANDLE)NULL;
-      TRACE(progress, "Progress Ctrl creation, hwnd=%04x\n", hwnd);
+      TRACE("Progress Ctrl creation, hwnd=%04x\n", hwnd);
       break;
     
     case WM_DESTROY:
-      TRACE (progress, "Progress Ctrl destruction, hwnd=%04x\n", hwnd);
+      TRACE("Progress Ctrl destruction, hwnd=%04x\n", hwnd);
       COMCTL32_Free (infoPtr);
       break;
 
@@ -341,7 +341,7 @@
 
     default: 
       if (message >= WM_USER) 
-	ERR(progress, "unknown msg %04x wp=%04x lp=%08lx\n", 
+	ERR("unknown msg %04x wp=%04x lp=%08lx\n", 
 		    message, wParam, lParam );
       return DefWindowProcA( hwnd, message, wParam, lParam ); 
     } 
diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index ab31345..ceb20d9 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -16,7 +16,7 @@
 #include "prsht.h"
 #include "winnls.h"
 #include "comctl32.h"
-#include "debug.h"
+#include "debugtools.h"
 
 
 /******************************************************************************
@@ -144,7 +144,7 @@
 
   if (dwFlags & PSH_USEPSTARTPAGE)
   {
-    TRACE(propsheet, "PSH_USEPSTARTPAGE is on");
+    TRACE("PSH_USEPSTARTPAGE is on");
     psInfo->active_page = 0;
   }
   else
@@ -268,7 +268,7 @@
 
   /* Extract the caption */
   psInfo->proppage[index].pszText = (LPCWSTR)p;
-  TRACE(propsheet, "Tab %d %s\n",index,debugstr_w((LPCWSTR)p));
+  TRACE("Tab %d %s\n",index,debugstr_w((LPCWSTR)p));
   p += lstrlenW((LPCWSTR)p) + 1;
 
   return TRUE;
@@ -326,7 +326,7 @@
    * Original tab size.
    */
   GetClientRect(hwndTabCtrl, &rcOrigTab);
-  TRACE(propsheet, "orig tab %d %d %d %d\n", rcOrigTab.left, rcOrigTab.top,
+  TRACE("orig tab %d %d %d %d\n", rcOrigTab.left, rcOrigTab.top,
         rcOrigTab.right, rcOrigTab.bottom);
 
   /*
@@ -338,7 +338,7 @@
   rcPage.bottom = psInfo->height;
 
   MapDialogRect(hwndDlg, &rcPage);
-  TRACE(propsheet, "biggest page %d %d %d %d\n", rcPage.left, rcPage.top,
+  TRACE("biggest page %d %d %d %d\n", rcPage.left, rcPage.top,
         rcPage.right, rcPage.bottom);
 
   if (rcPage.right > rcOrigTab.right)
@@ -392,7 +392,7 @@
 
   GetClientRect(hwndTabCtrl, &rc);
 
-  TRACE(propsheet, "tab client rc %d %d %d %d\n",
+  TRACE("tab client rc %d %d %d %d\n",
         rc.left, rc.top, rc.right, rc.bottom);
 
   rc.right += ((padding.x * 2) + tabOffsetX);
@@ -576,7 +576,7 @@
   PADDING_INFO padding = PROPSHEET_GetPaddingInfo(hwndParent);
   HWND hwndTabCtrl = GetDlgItem(hwndParent, IDC_TABCONTROL);
 
-  TRACE(propsheet, "index %d\n", index);
+  TRACE("index %d\n", index);
 
   if (ppshpage->dwFlags & PSP_DLGINDIRECT)
     pTemplate = (DLGTEMPLATE*)ppshpage->u1.pResource;
@@ -821,25 +821,25 @@
       SendMessageA(hwndDlg, WM_COMMAND, IDC_APPLY_BUTTON, 0);
       break;
     case PSBTN_BACK:
-      FIXME(propsheet, "Wizard mode not implemented.\n");
+      FIXME("Wizard mode not implemented.\n");
       break;
     case PSBTN_CANCEL:
       SendMessageA(hwndDlg, WM_COMMAND, IDCANCEL, 0);
       break;
     case PSBTN_FINISH:
-      FIXME(propsheet, "Wizard mode not implemented.\n");
+      FIXME("Wizard mode not implemented.\n");
       break;
     case PSBTN_HELP:
       SendMessageA(hwndDlg, WM_COMMAND, IDHELP, 0);
       break;
     case PSBTN_NEXT:
-      FIXME(propsheet, "Wizard mode not implemented.\n");
+      FIXME("Wizard mode not implemented.\n");
       break;
     case PSBTN_OK:
       SendMessageA(hwndDlg, WM_COMMAND, IDOK, 0);
       break;
     default:
-      FIXME(propsheet, "Invalid button index %d\n", buttonID);
+      FIXME("Invalid button index %d\n", buttonID);
   }
 }
 
@@ -868,7 +868,7 @@
     return FALSE;
 
   if (hpage != NULL)
-    FIXME(propsheet, "Implement HPROPSHEETPAGE!\n");
+    FIXME("Implement HPROPSHEETPAGE!\n");
   else
     hwndPage = psInfo->proppage[index].hwndPage;
 
@@ -1034,12 +1034,12 @@
 
     if (index == -1)
     {
-      TRACE(propsheet, "Could not find page to remove!\n");
+      TRACE("Could not find page to remove!\n");
       return FALSE;
     }
   }
 
-  TRACE(propsheet, "total pages %d removing page %d active page %d\n",
+  TRACE("total pages %d removing page %d active page %d\n",
         psInfo->nPages, index, psInfo->active_page);
   /*
    * Check if we're removing the active page.
@@ -1061,7 +1061,7 @@
     }
     else
     {
-      TRACE(propsheet, "Removing the only page, close the dialog!\n");
+      TRACE("Removing the only page, close the dialog!\n");
 
       if (psInfo->isModeless)
         psInfo->active_page = -1;
@@ -1166,7 +1166,7 @@
  */
 INT WINAPI PropertySheetW(LPCPROPSHEETHEADERW propertySheetHeader)
 {
-    FIXME(propsheet, "(%p): stub\n", propertySheetHeader);
+    FIXME("(%p): stub\n", propertySheetHeader);
 
     return -1;
 }
@@ -1189,7 +1189,7 @@
  */
 HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
 {
-    FIXME(propsheet, "(%p): stub\n", lpPropSheetPage);
+    FIXME("(%p): stub\n", lpPropSheetPage);
 
     return 0;
 }
@@ -1429,7 +1429,7 @@
 
     case PSM_ISDIALOGMESSAGE:
     {
-      FIXME (propsheet, "Unimplemented msg PSM_ISDIALOGMESSAGE\n");
+      FIXME("Unimplemented msg PSM_ISDIALOGMESSAGE\n");
       return 0;
     }
 
@@ -1438,19 +1438,19 @@
       return TRUE;
 
     case PSM_SETTITLEW:
-        FIXME (propsheet, "Unimplemented msg PSM_SETTITLE32W\n");
+        FIXME("Unimplemented msg PSM_SETTITLE32W\n");
         return 0;
     case PSM_SETWIZBUTTONS:
-        FIXME (propsheet, "Unimplemented msg PSM_SETWIZBUTTONS\n");
+        FIXME("Unimplemented msg PSM_SETWIZBUTTONS\n");
         return 0;
     case PSM_SETCURSELID:
-        FIXME (propsheet, "Unimplemented msg PSM_SETCURSELID\n");
+        FIXME("Unimplemented msg PSM_SETCURSELID\n");
         return 0;
     case PSM_SETFINISHTEXTA:
-        FIXME (propsheet, "Unimplemented msg PSM_SETFINISHTEXT32A\n");
+        FIXME("Unimplemented msg PSM_SETFINISHTEXT32A\n");
         return 0;
     case PSM_SETFINISHTEXTW:
-        FIXME (propsheet, "Unimplemented msg PSM_SETFINISHTEXT32W\n");
+        FIXME("Unimplemented msg PSM_SETFINISHTEXT32W\n");
         return 0;
 
     default:
diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c
index 3692b80..1bcfac1 100644
--- a/dlls/comctl32/rebar.c
+++ b/dlls/comctl32/rebar.c
@@ -24,7 +24,7 @@
 #include "wingdi.h"
 #include "commctrl.h"
 #include "rebar.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(rebar)
 
@@ -371,7 +371,7 @@
     REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);
     RECT rc;
 
-    TRACE (rebar, " to [%d x %d]!\n",
+    TRACE(" to [%d x %d]!\n",
 	   infoPtr->calcSize.cx, infoPtr->calcSize.cy);
 
     infoPtr->bAutoResize = TRUE;
@@ -405,7 +405,7 @@
 	if (lpBand->fStyle & RBBS_HIDDEN)
 	    continue;
 	if (lpBand->hwndChild) {
-	    TRACE (rebar, "hwndChild = %x\n", lpBand->hwndChild);
+	    TRACE("hwndChild = %x\n", lpBand->hwndChild);
 
 	    GetClassNameA (lpBand->hwndChild, szClassName, 40);
 	    if (!lstrcmpA (szClassName, "ComboBox")) {
@@ -463,7 +463,7 @@
 	    *pFlags = RBHT_NOWHERE;
 	    if (pBand)
 		*pBand = -1;
-	    TRACE (rebar, "NOWHERE\n");
+	    TRACE("NOWHERE\n");
 	    return;
 	}
 	else {
@@ -475,27 +475,27 @@
 			*pBand = iCount;
 		    if (PtInRect (&lpBand->rcGripper, *lpPt)) {
 			*pFlags = RBHT_GRABBER;
-			TRACE (rebar, "ON GRABBER %d\n", iCount);
+			TRACE("ON GRABBER %d\n", iCount);
 			return;
 		    }
 		    else if (PtInRect (&lpBand->rcCapImage, *lpPt)) {
 			*pFlags = RBHT_CAPTION;
-			TRACE (rebar, "ON CAPTION %d\n", iCount);
+			TRACE("ON CAPTION %d\n", iCount);
 			return;
 		    }
 		    else if (PtInRect (&lpBand->rcCapText, *lpPt)) {
 			*pFlags = RBHT_CAPTION;
-			TRACE (rebar, "ON CAPTION %d\n", iCount);
+			TRACE("ON CAPTION %d\n", iCount);
 			return;
 		    }
 		    else if (PtInRect (&lpBand->rcChild, *lpPt)) {
 			*pFlags = RBHT_CLIENT;
-			TRACE (rebar, "ON CLIENT %d\n", iCount);
+			TRACE("ON CLIENT %d\n", iCount);
 			return;
 		    }
 		    else {
 			*pFlags = RBHT_NOWHERE;
-			TRACE (rebar, "NOWHERE %d\n", iCount);
+			TRACE("NOWHERE %d\n", iCount);
 			return;
 		    }
 		}
@@ -505,7 +505,7 @@
 	    if (pBand)
 		*pBand = -1;
 
-	    TRACE (rebar, "NOWHERE\n");
+	    TRACE("NOWHERE\n");
 	    return;
 	}
     }
@@ -513,11 +513,11 @@
 	*pFlags = RBHT_NOWHERE;
 	if (pBand)
 	    *pBand = -1;
-	TRACE (rebar, "NOWHERE\n");
+	TRACE("NOWHERE\n");
 	return;
     }
 
-    TRACE (rebar, "flags=0x%X\n", *pFlags);
+    TRACE("flags=0x%X\n", *pFlags);
     return;
 }
 
@@ -535,17 +535,17 @@
     if (uBand >= infoPtr->uNumBands)
 	return FALSE;
 
-    TRACE (rebar, "deleting band %u!\n", uBand);
+    TRACE("deleting band %u!\n", uBand);
 
     if (infoPtr->uNumBands == 1) {
-	TRACE (rebar, " simple delete!\n");
+	TRACE(" simple delete!\n");
 	COMCTL32_Free (infoPtr->bands);
 	infoPtr->bands = NULL;
 	infoPtr->uNumBands = 0;
     }
     else {
 	REBAR_BAND *oldBands = infoPtr->bands;
-        TRACE(rebar, "complex delete! [uBand=%u]\n", uBand);
+        TRACE("complex delete! [uBand=%u]\n", uBand);
 
 	infoPtr->uNumBands--;
 	infoPtr->bands = COMCTL32_Alloc (sizeof (REBAR_BAND) * infoPtr->uNumBands);
@@ -603,7 +603,7 @@
 {
     REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);
 
-    TRACE (rebar, "band count %u!\n", infoPtr->uNumBands);
+    TRACE("band count %u!\n", infoPtr->uNumBands);
 
     return infoPtr->uNumBands;
 }
@@ -623,7 +623,7 @@
     if ((UINT)wParam >= infoPtr->uNumBands)
 	return FALSE;
 
-    TRACE (rebar, "index %u\n", (UINT)wParam);
+    TRACE("index %u\n", (UINT)wParam);
 
     /* copy band information */
     lpBand = &infoPtr->bands[(UINT)wParam];
@@ -694,7 +694,7 @@
     if ((UINT)wParam >= infoPtr->uNumBands)
 	return FALSE;
 
-    TRACE (rebar, "index %u\n", (UINT)wParam);
+    TRACE("index %u\n", (UINT)wParam);
 
     /* copy band information */
     lpBand = &infoPtr->bands[(UINT)wParam];
@@ -764,7 +764,7 @@
 	nHeight += (2 * GetSystemMetrics(SM_CYEDGE));
 
 
-    FIXME (rebar, "height = %d\n", nHeight);
+    FIXME("height = %d\n", nHeight);
 
     return nHeight;
 }
@@ -782,7 +782,7 @@
     if (lpInfo->cbSize < sizeof (REBARINFO))
 	return FALSE;
 
-    TRACE (rebar, "getting bar info!\n");
+    TRACE("getting bar info!\n");
 
     if (infoPtr->himl) {
 	lpInfo->himl = infoPtr->himl;
@@ -798,7 +798,7 @@
 {
     REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);
 
-    TRACE (rebar, "background color 0x%06lx!\n", infoPtr->clrBk);
+    TRACE("background color 0x%06lx!\n", infoPtr->clrBk);
 
     return infoPtr->clrBk;
 }
@@ -811,7 +811,7 @@
 static LRESULT
 REBAR_GetPalette (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
-    FIXME (rebar, "empty stub!\n");
+    FIXME("empty stub!\n");
 
     return 0;
 }
@@ -830,7 +830,7 @@
     if (!lprc)
 	return FALSE;
 
-    TRACE (rebar, "band %d\n", iBand);
+    TRACE("band %d\n", iBand);
 
     lpBand = &infoPtr->bands[iBand];
     CopyRect (lprc, &lpBand->rcBand);
@@ -850,7 +850,7 @@
 {
     REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);
 
-    FIXME (rebar, "%u : semi stub!\n", infoPtr->uNumBands);
+    FIXME("%u : semi stub!\n", infoPtr->uNumBands);
 
     return infoPtr->uNumBands;
 }
@@ -861,7 +861,7 @@
 {
 /*    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd); */
 
-    FIXME (rebar, "-- height = 20: semi stub!\n");
+    FIXME("-- height = 20: semi stub!\n");
 
     return 20;
 }
@@ -872,7 +872,7 @@
 {
     REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);
 
-    TRACE (rebar, "text color 0x%06lx!\n", infoPtr->clrText);
+    TRACE("text color 0x%06lx!\n", infoPtr->clrText);
 
     return infoPtr->clrText;
 }
@@ -921,16 +921,16 @@
     if (infoPtr->uNumBands < 1)
 	return -1;
 
-    TRACE (rebar, "id %u\n", (UINT)wParam);
+    TRACE("id %u\n", (UINT)wParam);
 
     for (i = 0; i < infoPtr->uNumBands; i++) {
 	if (infoPtr->bands[i].wID == (UINT)wParam) {
-	    TRACE (rebar, "band %u found!\n", i);
+	    TRACE("band %u found!\n", i);
 	    return i;
 	}
     }
 
-    TRACE (rebar, "no band found!\n");
+    TRACE("no band found!\n");
     return -1;
 }
 
@@ -950,7 +950,7 @@
     if (lprbbi->cbSize < REBARBANDINFO_V3_SIZEA)
 	return FALSE;
 
-    TRACE (rebar, "insert band at %u!\n", uIndex);
+    TRACE("insert band at %u!\n", uIndex);
 
     if (infoPtr->uNumBands == 0) {
 	infoPtr->bands = (REBAR_BAND *)COMCTL32_Alloc (sizeof (REBAR_BAND));
@@ -980,7 +980,7 @@
 
     infoPtr->uNumBands++;
 
-    TRACE (rebar, "index %u!\n", uIndex);
+    TRACE("index %u!\n", uIndex);
 
     /* initialize band (infoPtr->bands[uIndex])*/
     lpBand = &infoPtr->bands[uIndex];
@@ -1011,7 +1011,7 @@
 	lpBand->iImage = -1;
 
     if (lprbbi->fMask & RBBIM_CHILD) {
-	TRACE (rebar, "hwndChild = %x\n", lprbbi->hwndChild);
+	TRACE("hwndChild = %x\n", lprbbi->hwndChild);
 	lpBand->hwndChild = lprbbi->hwndChild;
 	lpBand->hwndPrevParent =
 	    SetParent (lpBand->hwndChild, hwnd);
@@ -1079,7 +1079,7 @@
     if (lprbbi->cbSize < REBARBANDINFO_V3_SIZEW)
 	return FALSE;
 
-    TRACE (rebar, "insert band at %u!\n", uIndex);
+    TRACE("insert band at %u!\n", uIndex);
 
     if (infoPtr->uNumBands == 0) {
 	infoPtr->bands = (REBAR_BAND *)COMCTL32_Alloc (sizeof (REBAR_BAND));
@@ -1109,7 +1109,7 @@
 
     infoPtr->uNumBands++;
 
-    TRACE (rebar, "index %u!\n", uIndex);
+    TRACE("index %u!\n", uIndex);
 
     /* initialize band (infoPtr->bands[uIndex])*/
     lpBand = &infoPtr->bands[uIndex];
@@ -1140,7 +1140,7 @@
 	lpBand->iImage = -1;
 
     if (lprbbi->fMask & RBBIM_CHILD) {
-	TRACE (rebar, "hwndChild = %x\n", lprbbi->hwndChild);
+	TRACE("hwndChild = %x\n", lprbbi->hwndChild);
 	lpBand->hwndChild = lprbbi->hwndChild;
 	lpBand->hwndPrevParent =
 	    SetParent (lpBand->hwndChild, hwnd);
@@ -1198,7 +1198,7 @@
 {
 /*    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd); */
 
-    FIXME (rebar, "(uBand = %u fIdeal = %s)\n",
+    FIXME("(uBand = %u fIdeal = %s)\n",
 	   (UINT)wParam, lParam ? "TRUE" : "FALSE");
 
  
@@ -1211,7 +1211,7 @@
 {
 /*    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd); */
 
-    FIXME (rebar, "(uBand = %u)\n", (UINT)wParam);
+    FIXME("(uBand = %u)\n", (UINT)wParam);
 
  
     return 0;
@@ -1223,7 +1223,7 @@
 {
 /*    REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd); */
 
-    FIXME (rebar, "(iFrom = %u iTof = %u)\n",
+    FIXME("(iFrom = %u iTof = %u)\n",
 	   (UINT)wParam, (UINT)lParam);
 
  
@@ -1245,7 +1245,7 @@
     if ((UINT)wParam >= infoPtr->uNumBands)
 	return FALSE;
 
-    TRACE (rebar, "index %u\n", (UINT)wParam);
+    TRACE("index %u\n", (UINT)wParam);
 
     /* set band information */
     lpBand = &infoPtr->bands[(UINT)wParam];
@@ -1280,7 +1280,7 @@
 		SetParent (lpBand->hwndChild, hwnd);
 	}
 	else {
-	    TRACE (rebar, "child: 0x%x  prev parent: 0x%x\n",
+	    TRACE("child: 0x%x  prev parent: 0x%x\n",
 		   lpBand->hwndChild, lpBand->hwndPrevParent);
 	    lpBand->hwndChild = 0;
 	    lpBand->hwndPrevParent = 0;
@@ -1338,7 +1338,7 @@
     if ((UINT)wParam >= infoPtr->uNumBands)
 	return FALSE;
 
-    TRACE (rebar, "index %u\n", (UINT)wParam);
+    TRACE("index %u\n", (UINT)wParam);
 
     /* set band information */
     lpBand = &infoPtr->bands[(UINT)wParam];
@@ -1373,7 +1373,7 @@
 		SetParent (lpBand->hwndChild, hwnd);
 	}
 	else {
-	    TRACE (rebar, "child: 0x%x  prev parent: 0x%x\n",
+	    TRACE("child: 0x%x  prev parent: 0x%x\n",
 		   lpBand->hwndChild, lpBand->hwndPrevParent);
 	    lpBand->hwndChild = 0;
 	    lpBand->hwndPrevParent = 0;
@@ -1429,7 +1429,7 @@
     if (lpInfo->cbSize < sizeof (REBARINFO))
 	return FALSE;
 
-    TRACE (rebar, "setting bar info!\n");
+    TRACE("setting bar info!\n");
 
     if (lpInfo->fMask & RBIM_IMAGELIST) {
 	infoPtr->himl = lpInfo->himl;
@@ -1456,7 +1456,7 @@
     clrTemp = infoPtr->clrBk;
     infoPtr->clrBk = (COLORREF)lParam;
 
-    TRACE (rebar, "background color 0x%06lx!\n", infoPtr->clrBk);
+    TRACE("background color 0x%06lx!\n", infoPtr->clrBk);
 
     return clrTemp;
 }
@@ -1487,7 +1487,7 @@
     clrTemp = infoPtr->clrText;
     infoPtr->clrText = (COLORREF)lParam;
 
-    TRACE (rebar, "text color 0x%06lx!\n", infoPtr->clrText);
+    TRACE("text color 0x%06lx!\n", infoPtr->clrText);
 
     return clrTemp;
 }
@@ -1518,13 +1518,13 @@
     lpBand = &infoPtr->bands[(INT)wParam];
 
     if ((BOOL)lParam) {
-	TRACE (rebar, "show band %d\n", (INT)wParam);
+	TRACE("show band %d\n", (INT)wParam);
 	lpBand->fStyle = lpBand->fStyle & ~RBBS_HIDDEN;
 	if (IsWindow (lpBand->hwndChild))
 	    ShowWindow (lpBand->hwndChild, SW_SHOW);
     }
     else {
-	TRACE (rebar, "hide band %d\n", (INT)wParam);
+	TRACE("hide band %d\n", (INT)wParam);
 	lpBand->fStyle = lpBand->fStyle | RBBS_HIDDEN;
 	if (IsWindow (lpBand->hwndChild))
 	    ShowWindow (lpBand->hwndChild, SW_SHOW);
@@ -1547,8 +1547,8 @@
     if (lpRect == NULL)
 	return FALSE;
 
-    FIXME (rebar, "layout change not implemented!\n");
-    FIXME (rebar, "[%d %d %d %d]\n",
+    FIXME("layout change not implemented!\n");
+    FIXME("[%d %d %d %d]\n",
 	   lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
 
 #if 0
@@ -1588,13 +1588,13 @@
     infoPtr->bUnicode = IsWindowUnicode (hwnd);
 
     if (GetWindowLongA (hwnd, GWL_STYLE) & RBS_AUTOSIZE)
-	FIXME (rebar, "style RBS_AUTOSIZE set!\n");
+	FIXME("style RBS_AUTOSIZE set!\n");
 
 #if 0
     SendMessageA (hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);
 #endif
 
-    TRACE (rebar, "created!\n");
+    TRACE("created!\n");
     return 0;
 }
 
@@ -1641,7 +1641,7 @@
     /* free rebar info data */
     COMCTL32_Free (infoPtr);
 
-    TRACE (rebar, "destroyed!\n");
+    TRACE("destroyed!\n");
     return 0;
 }
 
@@ -1729,7 +1729,7 @@
     POINT pt;
     UINT  flags;
 
-    TRACE (rebar, "code=0x%X  id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
+    TRACE("code=0x%X  id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
 
     GetCursorPos (&pt);
     ScreenToClient (hwnd, &pt);
@@ -1796,7 +1796,7 @@
 	return 0;
     }
 
-    TRACE (rebar, "sizing rebar!\n");
+    TRACE("sizing rebar!\n");
 
     /* get parent rectangle */
     GetClientRect (GetParent (hwnd), &rcParent);
@@ -2000,7 +2000,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (rebar, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c
index 31b3c22..2dadddf 100644
--- a/dlls/comctl32/status.c
+++ b/dlls/comctl32/status.c
@@ -8,7 +8,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "status.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(statusbar)
 
@@ -599,7 +599,7 @@
 	    ti.cbSize = sizeof(TTTOOLINFOA);
 	    ti.hwnd = hwnd;
 	    for (i = nTipCount; i < self->numParts; i++) {
-		TRACE (statusbar, "add tool %d\n", i);
+		TRACE("add tool %d\n", i);
 		ti.uId = i;
 		SendMessageA (self->hwndToolTip, TTM_ADDTOOLA,
 				0, (LPARAM)&ti);
@@ -611,7 +611,7 @@
 
 	    for (i = nTipCount - 1; i >= self->numParts; i--) {
 
-		FIXME (statusbar, "delete tool %d\n", i);
+		FIXME("delete tool %d\n", i);
 
 	    }
 	}
@@ -716,7 +716,7 @@
 {
     STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (hwnd);
 
-    TRACE (statusbar, "part %d: \"%s\"\n", (INT)wParam, (LPSTR)lParam);
+    TRACE("part %d: \"%s\"\n", (INT)wParam, (LPSTR)lParam);
     if (infoPtr->hwndToolTip) {
 	TTTOOLINFOA ti;
 	ti.cbSize = sizeof(TTTOOLINFOA);
@@ -737,7 +737,7 @@
 {
     STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (hwnd);
 
-    TRACE (statusbar, "part %d: \"%s\"\n", (INT)wParam, (LPSTR)lParam);
+    TRACE("part %d: \"%s\"\n", (INT)wParam, (LPSTR)lParam);
     if (infoPtr->hwndToolTip) {
 	TTTOOLINFOW ti;
 	ti.cbSize = sizeof(TTTOOLINFOW);
@@ -759,7 +759,7 @@
     STATUSWINDOWINFO *infoPtr = STATUSBAR_GetInfoPtr (hwnd);
     BOOL bTemp = infoPtr->bUnicode;
 
-    TRACE (statusbar, "(0x%x)\n", (BOOL)wParam);
+    TRACE("(0x%x)\n", (BOOL)wParam);
     infoPtr->bUnicode = (BOOL)wParam;
 
     return bTemp;
@@ -1229,7 +1229,7 @@
 
 	default:
 	    if (msg >= WM_USER)
-		ERR (statusbar, "unknown msg %04x wp=%04x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%04x lp=%08lx\n",
 		     msg, wParam, lParam);
 	    return DefWindowProcA (hwnd, msg, wParam, lParam);
     }
diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c
index fa0ce78..82cb4dd 100644
--- a/dlls/comctl32/tab.c
+++ b/dlls/comctl32/tab.c
@@ -16,7 +16,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "tab.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(tab)
 
@@ -129,7 +129,7 @@
 
   infoPtr->uFocus=iItem;
   if (GetWindowLongA(hwnd, GWL_STYLE) & TCS_BUTTONS) {
-    FIXME (tab,"Should set input focus\n");
+    FIXME("Should set input focus\n");
   } else { 
     if (infoPtr->iSelected != iItem) {
       if (TAB_SendSimpleNotify(hwnd, TCN_SELCHANGING)!=TRUE)  {
@@ -398,7 +398,7 @@
   
   newItem=TAB_InternalHitTest (hwnd, infoPtr,pt,&dummy);
   
-  TRACE(tab, "On Tab, item %d\n", newItem);
+  TRACE("On Tab, item %d\n", newItem);
     
   if ( (newItem!=-1) &&
        (infoPtr->iSelected != newItem) )
@@ -714,8 +714,8 @@
                                            size.cx + 2*HORIZONTAL_ITEM_PADDING;
     }
 
-    TRACE(tab, "TextSize: %i\n ", size.cx);
-    TRACE(tab, "Rect: T %i, L %i, B %i, R %i\n", 
+    TRACE("TextSize: %i\n ", size.cx);
+    TRACE("Rect: T %i, L %i, B %i, R %i\n", 
 	  infoPtr->items[curItem].rect.top,
 	  infoPtr->items[curItem].rect.left,
 	  infoPtr->items[curItem].rect.bottom,
@@ -1245,7 +1245,7 @@
   RECT rect;
   
   GetClientRect (hwnd, &rect);
-  TRACE(tab, "Rect: %x T %i, L %i, B %i, R %i\n", hwnd,
+  TRACE("Rect: %x T %i, L %i, B %i, R %i\n", hwnd,
         rect.top, rect.left, rect.bottom, rect.right);  
   
   pti = (TCITEMA *)lParam;
@@ -1297,7 +1297,7 @@
   
   TAB_InvalidateTabArea(hwnd, infoPtr);
   
-  TRACE(tab, "[%04x]: added item %d '%s'\n",
+  TRACE("[%04x]: added item %d '%s'\n",
 	hwnd, iItem, infoPtr->items[iItem].pszText);
 
   TAB_SetItemBounds(hwnd);
@@ -1331,7 +1331,7 @@
 
   iItem=(INT) wParam;
   tabItem=(LPTCITEMA ) lParam;
-  TRACE (tab,"%d %p\n",iItem, tabItem);
+  TRACE("%d %p\n",iItem, tabItem);
   if ((iItem<0) || (iItem>infoPtr->uNumItem)) return FALSE;
 
   wineItem=& infoPtr->items[iItem];
@@ -1343,7 +1343,7 @@
     wineItem->lParam=tabItem->lParam;
 
   if (tabItem->mask & TCIF_RTLREADING) 
-    FIXME (tab,"TCIF_RTLREADING\n");
+    FIXME("TCIF_RTLREADING\n");
 
   if (tabItem->mask & TCIF_STATE) 
     wineItem->dwState=tabItem->dwState;
@@ -1377,7 +1377,7 @@
 
   iItem=(INT) wParam;
   tabItem=(LPTCITEMA) lParam;
-  TRACE (tab,"\n");
+  TRACE("\n");
   if ((iItem<0) || (iItem>infoPtr->uNumItem)) return FALSE;
 
   wineItem=& infoPtr->items[iItem];
@@ -1389,7 +1389,7 @@
     tabItem->lParam=wineItem->lParam;
 
   if (tabItem->mask & TCIF_RTLREADING) 
-    FIXME (tab, "TCIF_RTLREADING\n");
+    FIXME("TCIF_RTLREADING\n");
 
   if (tabItem->mask & TCIF_STATE) 
     tabItem->dwState=wineItem->dwState;
@@ -1461,7 +1461,7 @@
 {
   TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
 
-  TRACE (tab,"\n");
+  TRACE("\n");
   return (LRESULT)infoPtr->hFont;
 }
 
@@ -1471,7 +1471,7 @@
 {
   TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
   
-  TRACE (tab,"%x %lx\n",wParam, lParam);
+  TRACE("%x %lx\n",wParam, lParam);
   
   infoPtr->hFont = (HFONT)wParam;
   
@@ -1488,7 +1488,7 @@
 {
   TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
 
-  TRACE (tab,"\n");
+  TRACE("\n");
   return (LRESULT)infoPtr->himl;
 }
 
@@ -1498,7 +1498,7 @@
     TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
     HIMAGELIST himlPrev;
 
-    TRACE (tab,"\n");
+    TRACE("\n");
     himlPrev = infoPtr->himl;
     infoPtr->himl= (HIMAGELIST)lParam;
     return (LRESULT)himlPrev;
@@ -1571,7 +1571,7 @@
   infoPtr->hwndUpDown      = 0;
   infoPtr->leftmostVisible = 0;
   
-  TRACE(tab, "Created tab control, hwnd [%04x]\n", hwnd); 
+  TRACE("Created tab control, hwnd [%04x]\n", hwnd); 
   if (GetWindowLongA(hwnd, GWL_STYLE) & TCS_TOOLTIPS) {
     /* Create tooltip control */
     infoPtr->hwndToolTip =
@@ -1666,14 +1666,14 @@
       return TAB_GetItemA (hwnd, wParam, lParam);
       
     case TCM_GETITEMW:
-      FIXME (tab, "Unimplemented msg TCM_GETITEMW\n");
+      FIXME("Unimplemented msg TCM_GETITEMW\n");
       return 0;
       
     case TCM_SETITEMA:
       return TAB_SetItemA (hwnd, wParam, lParam);
       
     case TCM_SETITEMW:
-      FIXME (tab, "Unimplemented msg TCM_SETITEMW\n");
+      FIXME("Unimplemented msg TCM_SETITEMW\n");
       return 0;
       
     case TCM_DELETEITEM:
@@ -1698,11 +1698,11 @@
       return TAB_InsertItem (hwnd, wParam, lParam);
       
     case TCM_INSERTITEMW:
-      FIXME (tab, "Unimplemented msg TCM_INSERTITEM32W\n");
+      FIXME("Unimplemented msg TCM_INSERTITEM32W\n");
       return 0;
       
     case TCM_SETITEMEXTRA:
-      FIXME (tab, "Unimplemented msg TCM_SETITEMEXTRA\n");
+      FIXME("Unimplemented msg TCM_SETITEMEXTRA\n");
       return 0;
       
     case TCM_ADJUSTRECT:
@@ -1712,27 +1712,27 @@
       return TAB_SetItemSize (hwnd, wParam, lParam);
       
     case TCM_REMOVEIMAGE:
-      FIXME (tab, "Unimplemented msg TCM_REMOVEIMAGE\n");
+      FIXME("Unimplemented msg TCM_REMOVEIMAGE\n");
       return 0;
       
     case TCM_SETPADDING:
-      FIXME (tab, "Unimplemented msg TCM_SETPADDING\n");
+      FIXME("Unimplemented msg TCM_SETPADDING\n");
       return 0;
       
     case TCM_GETROWCOUNT:
-      FIXME (tab, "Unimplemented msg TCM_GETROWCOUNT\n");
+      FIXME("Unimplemented msg TCM_GETROWCOUNT\n");
       return 0;
 
     case TCM_GETUNICODEFORMAT:
-      FIXME (tab, "Unimplemented msg TCM_GETUNICODEFORMAT\n");
+      FIXME("Unimplemented msg TCM_GETUNICODEFORMAT\n");
       return 0;
 
     case TCM_SETUNICODEFORMAT:
-      FIXME (tab, "Unimplemented msg TCM_SETUNICODEFORMAT\n");
+      FIXME("Unimplemented msg TCM_SETUNICODEFORMAT\n");
       return 0;
 
     case TCM_HIGHLIGHTITEM:
-      FIXME (tab, "Unimplemented msg TCM_HIGHLIGHTITEM\n");
+      FIXME("Unimplemented msg TCM_HIGHLIGHTITEM\n");
       return 0;
       
     case TCM_GETTOOLTIPS:
@@ -1748,19 +1748,19 @@
       return TAB_SetCurFocus (hwnd, wParam);
       
     case TCM_SETMINTTABWIDTH:
-      FIXME (tab, "Unimplemented msg TCM_SETMINTTABWIDTH\n");
+      FIXME("Unimplemented msg TCM_SETMINTTABWIDTH\n");
       return 0;
       
     case TCM_DESELECTALL:
-      FIXME (tab, "Unimplemented msg TCM_DESELECTALL\n");
+      FIXME("Unimplemented msg TCM_DESELECTALL\n");
       return 0;
       
     case TCM_GETEXTENDEDSTYLE:
-      FIXME (tab, "Unimplemented msg TCM_GETEXTENDEDSTYLE\n");
+      FIXME("Unimplemented msg TCM_GETEXTENDEDSTYLE\n");
       return 0;
 
     case TCM_SETEXTENDEDSTYLE:
-      FIXME (tab, "Unimplemented msg TCM_SETEXTENDEDSTYLE\n");
+      FIXME("Unimplemented msg TCM_SETEXTENDEDSTYLE\n");
       return 0;
 
     case WM_GETFONT:
@@ -1814,7 +1814,7 @@
 
     default:
       if (uMsg >= WM_USER)
-	ERR (tab, "unknown msg %04x wp=%08x lp=%08lx\n",
+	ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 	     uMsg, wParam, lParam);
       return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index af5593c..bf8779e 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -34,7 +34,7 @@
 #include "cache.h"
 #include "comctl32.h"
 #include "toolbar.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(toolbar)
 
@@ -321,7 +321,7 @@
     SelectObject (hdc, hOldFont);
     ReleaseDC (0, hdc);
 
-    TRACE (toolbar, "string size %d x %d!\n", lpSize->cx, lpSize->cy);
+    TRACE("string size %d x %d!\n", lpSize->cx, lpSize->cy);
 }
 
 /***********************************************************************
@@ -601,7 +601,7 @@
 		       	nSepRows * SEPARATOR_WIDTH * 2 / 3 +
 			nSepRows * (infoPtr->nBitmapHeight + 1) + 
 			BOTTOM_BORDER; 
-    TRACE (toolbar, "toolbar height %d\n", infoPtr->nHeight);
+    TRACE("toolbar height %d\n", infoPtr->nHeight);
 }
 
 
@@ -619,19 +619,19 @@
 
 	if (btnPtr->fsStyle & TBSTYLE_SEP) {
 	    if (PtInRect (&btnPtr->rect, *lpPt)) {
-		TRACE (toolbar, " ON SEPARATOR %d!\n", i);
+		TRACE(" ON SEPARATOR %d!\n", i);
 		return -i;
 	    }
 	}
 	else {
 	    if (PtInRect (&btnPtr->rect, *lpPt)) {
-		TRACE (toolbar, " ON BUTTON %d!\n", i);
+		TRACE(" ON BUTTON %d!\n", i);
 		return i;
 	    }
 	}
     }
 
-    TRACE (toolbar, " NOWHERE!\n");
+    TRACE(" NOWHERE!\n");
     return -1;
 }
 
@@ -645,11 +645,11 @@
     btnPtr = infoPtr->buttons;
     for (i = 0; i < infoPtr->nNumButtons; i++, btnPtr++) {
 	if (btnPtr->idCommand == idCommand) {
-	    TRACE (toolbar, "command=%d index=%d\n", idCommand, i);
+	    TRACE("command=%d index=%d\n", idCommand, i);
 	    return i;
 	}
     }
-    TRACE (toolbar, "no index found for command=%d\n", idCommand);
+    TRACE("no index found for command=%d\n", idCommand);
     return -1;
 }
 
@@ -794,7 +794,7 @@
 		COLORREF oldText = 0;
 		COLORREF oldBk = 0;
 
-		FIXME(toolbar, "action: %x itemState: %x\n",
+		FIXME("action: %x itemState: %x\n",
 		      lpdis->itemAction, lpdis->itemState);		
 
 		if (lpdis->itemState & ODS_FOCUS)
@@ -876,12 +876,12 @@
     if ((!lpAddBmp) || ((INT)wParam <= 0))
 	return -1;
 
-    TRACE (toolbar, "adding %d bitmaps!\n", wParam);
+    TRACE("adding %d bitmaps!\n", wParam);
 
     if (!(infoPtr->himlStd)) {
 	/* create new standard image list */
 
-	TRACE (toolbar, "creating standard image list!\n");
+	TRACE("creating standard image list!\n");
 
 
 	/* Windows resize all the buttons to the size of a newly added STandard Image*/
@@ -922,7 +922,7 @@
     else if (lpAddBmp->hInst == HINST_COMMCTRL) {
 	/* add internal bitmaps */
 	
-	FIXME (toolbar, "internal bitmaps not supported!\n");
+	FIXME("internal bitmaps not supported!\n");
 	/* TODO: Resize all the buttons when a new standard image is added */
 
 	/* Hack to "add" some reserved images within the image list 
@@ -952,7 +952,7 @@
     LPTBBUTTON lpTbb = (LPTBBUTTON)lParam;
     INT nOldButtons, nNewButtons, nAddButtons, nCount;
 
-    TRACE (toolbar, "adding %d buttons!\n", wParam);
+    TRACE("adding %d buttons!\n", wParam);
 
     nAddButtons = (UINT)wParam;
     nOldButtons = infoPtr->nNumButtons;
@@ -1019,12 +1019,12 @@
     if ((wParam) && (HIWORD(lParam) == 0)) {
 	char szString[256];
 	INT len;
-	TRACE (toolbar, "adding string from resource!\n");
+	TRACE("adding string from resource!\n");
 
 	len = LoadStringA ((HINSTANCE)wParam, (UINT)lParam,
 			     szString, 256);
 
-	TRACE (toolbar, "len=%d \"%s\"\n", len, szString);
+	TRACE("len=%d \"%s\"\n", len, szString);
 	nIndex = infoPtr->nNumStrings;
 	if (infoPtr->nNumStrings == 0) {
 	    infoPtr->strings =
@@ -1050,11 +1050,11 @@
 
 	if (p == NULL)
 	    return -1;
-	TRACE (toolbar, "adding string(s) from array!\n");
+	TRACE("adding string(s) from array!\n");
 	nIndex = infoPtr->nNumStrings;
 	while (*p) {
 	    len = lstrlenA (p);
-	    TRACE (toolbar, "len=%d \"%s\"\n", len, p);
+	    TRACE("len=%d \"%s\"\n", len, p);
 
 	    if (infoPtr->nNumStrings == 0) {
 		infoPtr->strings =
@@ -1091,12 +1091,12 @@
     if ((wParam) && (HIWORD(lParam) == 0)) {
 	WCHAR szString[256];
 	INT len;
-	TRACE (toolbar, "adding string from resource!\n");
+	TRACE("adding string from resource!\n");
 
 	len = LoadStringW ((HINSTANCE)wParam, (UINT)lParam,
 			     szString, 256);
 
-	TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(szString));
+	TRACE("len=%d \"%s\"\n", len, debugstr_w(szString));
 	nIndex = infoPtr->nNumStrings;
 	if (infoPtr->nNumStrings == 0) {
 	    infoPtr->strings =
@@ -1122,11 +1122,11 @@
 
 	if (p == NULL)
 	    return -1;
-	TRACE (toolbar, "adding string(s) from array!\n");
+	TRACE("adding string(s) from array!\n");
 	nIndex = infoPtr->nNumStrings;
 	while (*p) {
 	    len = lstrlenW (p);
-	    TRACE (toolbar, "len=%d \"%s\"\n", len, debugstr_w(p));
+	    TRACE("len=%d \"%s\"\n", len, debugstr_w(p));
 
 	    if (infoPtr->nNumStrings == 0) {
 		infoPtr->strings =
@@ -1165,7 +1165,7 @@
     INT  cx, cy;
     UINT uPosFlags = 0;
 
-    TRACE (toolbar, "resize forced!\n");
+    TRACE("resize forced!\n");
 
     parent = GetParent (hwnd);
     GetClientRect(parent, &parent_rect);
@@ -1212,8 +1212,8 @@
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
 
     if (infoPtr == NULL) {
-	ERR (toolbar, "(0x%x, 0x%x, 0x%lx)\n", hwnd, wParam, lParam);
-	ERR (toolbar, "infoPtr == NULL!\n");
+	ERR("(0x%x, 0x%x, 0x%lx)\n", hwnd, wParam, lParam);
+	ERR("infoPtr == NULL!\n");
 	return 0;
     }
 
@@ -1362,14 +1362,14 @@
     }
 
     if (infoPtr->nNumButtons == 1) {
-	TRACE (toolbar, " simple delete!\n");
+	TRACE(" simple delete!\n");
 	COMCTL32_Free (infoPtr->buttons);
 	infoPtr->buttons = NULL;
 	infoPtr->nNumButtons = 0;
     }
     else {
 	TBUTTON_INFO *oldButtons = infoPtr->buttons;
-        TRACE(toolbar, "complex delete! [nIndex=%d]\n", nIndex);
+        TRACE("complex delete! [nIndex=%d]\n", nIndex);
 
 	infoPtr->nNumButtons--;
 	infoPtr->buttons = COMCTL32_Alloc (sizeof (TBUTTON_INFO) * infoPtr->nNumButtons);
@@ -1542,7 +1542,7 @@
 
     nStringIndex = infoPtr->buttons[nIndex].iString;
 
-    TRACE (toolbar, "index=%d stringIndex=%d\n", nIndex, nStringIndex);
+    TRACE("index=%d stringIndex=%d\n", nIndex, nStringIndex);
 
     if ((nStringIndex < 0) || (nStringIndex >= infoPtr->nNumStrings))
 	return -1;
@@ -1654,7 +1654,7 @@
     lpSize->cx = infoPtr->rcBound.right - infoPtr->rcBound.left;
     lpSize->cy = infoPtr->rcBound.bottom - infoPtr->rcBound.top;
 
-    TRACE (toolbar, "maximum size %d x %d\n",
+    TRACE("maximum size %d x %d\n",
 	   infoPtr->rcBound.right - infoPtr->rcBound.left,
 	   infoPtr->rcBound.bottom - infoPtr->rcBound.top);
 
@@ -1761,7 +1761,7 @@
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
 
-    TRACE (toolbar, "%s hwnd=0x%x stub!\n", 
+    TRACE("%s hwnd=0x%x stub!\n", 
 	   infoPtr->bUnicode ? "TRUE" : "FALSE", hwnd);
 
     return infoPtr->bUnicode;
@@ -1839,10 +1839,10 @@
     if (nIndex < 0)
 	return FALSE;
 
-    TRACE (toolbar, "inserting button index=%d\n", nIndex);
+    TRACE("inserting button index=%d\n", nIndex);
     if (nIndex > infoPtr->nNumButtons) {
 	nIndex = infoPtr->nNumButtons;
-	TRACE (toolbar, "adjust index=%d\n", nIndex);
+	TRACE("adjust index=%d\n", nIndex);
     }
 
     oldButtons = infoPtr->buttons;
@@ -2026,7 +2026,7 @@
 
     if ((BOOL)wParam) {
 	/* save toolbar information */
-	FIXME (toolbar, "save to \"%s\" \"%s\"\n",
+	FIXME("save to \"%s\" \"%s\"\n",
 	       lpSave->pszSubKey, lpSave->pszValueName);
 
 
@@ -2034,7 +2034,7 @@
     else {
 	/* restore toolbar information */
 
-	FIXME (toolbar, "restore from \"%s\" \"%s\"\n",
+	FIXME("restore from \"%s\" \"%s\"\n",
 	       lpSave->pszSubKey, lpSave->pszValueName);
 
 
@@ -2159,7 +2159,7 @@
 
     if (infoPtr->hwndToolTip) {
 
-	FIXME (toolbar, "change tool tip!\n");
+	FIXME("change tool tip!\n");
 
     }
 
@@ -2325,7 +2325,7 @@
 
     if (LOWORD(wParam) > 1) {
 
-	FIXME (toolbar, "multiple rows not supported!\n");
+	FIXME("multiple rows not supported!\n");
 
     }
 
@@ -2391,7 +2391,7 @@
 
     if (infoPtr->hwndToolTip) {
 
-	FIXME (toolbar, "change tool tip!\n");
+	FIXME("change tool tip!\n");
 
     }
 
@@ -2417,7 +2417,7 @@
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     BOOL bTemp;
 
-    TRACE (toolbar, "%s hwnd=0x%04x stub!\n", 
+    TRACE("%s hwnd=0x%04x stub!\n", 
 	   ((BOOL)wParam) ? "TRUE" : "FALSE", hwnd);
 
     bTemp = infoPtr->bUnicode;
@@ -2819,7 +2819,7 @@
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
     LPNMHDR lpnmh = (LPNMHDR)lParam;
 
-    TRACE (toolbar, "passing WM_NOTIFY!\n");
+    TRACE("passing WM_NOTIFY!\n");
 
     if ((infoPtr->hwndToolTip) && (lpnmh->hwndFrom == infoPtr->hwndToolTip)) {
 	SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,	wParam, lParam);
@@ -2828,13 +2828,13 @@
 	if (lpnmh->code == TTN_GETDISPINFOA) {
 	    LPNMTTDISPINFOA lpdi = (LPNMTTDISPINFOA)lParam;
 
-	    FIXME (toolbar, "retrieving ASCII string\n");
+	    FIXME("retrieving ASCII string\n");
 
 	}
 	else if (lpnmh->code == TTN_GETDISPINFOW) {
 	    LPNMTTDISPINFOW lpdi = (LPNMTTDISPINFOW)lParam;
 
-	    FIXME (toolbar, "retrieving UNICODE string\n");
+	    FIXME("retrieving UNICODE string\n");
 
 	}
 #endif
@@ -2883,7 +2883,7 @@
      * SIZE_MAXIMIZED, SIZE_MAXSHOW, SIZE_MINIMIZED
      */
 
-    TRACE (toolbar, "sizing toolbar!\n");
+    TRACE("sizing toolbar!\n");
 
     if (flags == SIZE_RESTORED) {
 	/* width and height don't apply */
@@ -3238,7 +3238,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (toolbar, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/tooltips.c b/dlls/comctl32/tooltips.c
index 812dd0b..6b6fcd6 100644
--- a/dlls/comctl32/tooltips.c
+++ b/dlls/comctl32/tooltips.c
@@ -19,7 +19,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "tooltips.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(tooltips)
 
@@ -85,7 +85,7 @@
 
     if ((toolPtr->hinst) && (HIWORD((UINT)toolPtr->lpszText) == 0)) {
 	/* load a resource */
-	TRACE (tooltips, "load res string %x %x\n",
+	TRACE("load res string %x %x\n",
 	       toolPtr->hinst, (int)toolPtr->lpszText);
 	LoadStringW (toolPtr->hinst, (UINT)toolPtr->lpszText,
 		       infoPtr->szTipText, INFOTIPSIZE);
@@ -103,7 +103,7 @@
 	    ttnmdi.uFlags = toolPtr->uFlags;
 	    ttnmdi.lParam = toolPtr->lParam;
 
-	    TRACE (tooltips, "hdr.idFrom = %x\n", ttnmdi.hdr.idFrom);
+	    TRACE("hdr.idFrom = %x\n", ttnmdi.hdr.idFrom);
 	    SendMessageA (toolPtr->hwnd, WM_NOTIFY,
 			    (WPARAM)toolPtr->uId, (LPARAM)&ttnmdi);
 
@@ -138,7 +138,7 @@
 		}
 	    }
 	    else {
-		ERR (tooltips, "recursive text callback!\n");
+		ERR("recursive text callback!\n");
 		infoPtr->szTipText[0] = '\0';
 	    }
 	}
@@ -152,7 +152,7 @@
 	infoPtr->szTipText[0] = L'\0';
     }
 
-    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
+    TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText));
 }
 
 
@@ -170,7 +170,7 @@
     }
     if (GetWindowLongA (hwnd, GWL_STYLE) & TTS_NOPREFIX)
 	uFlags |= DT_NOPREFIX;
-    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
+    TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText));
 
     hdc = GetDC (hwnd);
     hOldFont = SelectObject (hdc, infoPtr->hFont);
@@ -195,13 +195,13 @@
     NMHDR  hdr;
 
     if (infoPtr->nTool == -1) {
-	TRACE (tooltips, "invalid tool (-1)!\n");
+	TRACE("invalid tool (-1)!\n");
 	return;
     }
 
     infoPtr->nCurrentTool = infoPtr->nTool;
 
-    TRACE (tooltips, "Show tooltip pre %d!\n", infoPtr->nTool);
+    TRACE("Show tooltip pre %d!\n", infoPtr->nTool);
 
     TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nCurrentTool);
 
@@ -210,7 +210,7 @@
 	return;
     }
 
-    TRACE (tooltips, "Show tooltip %d!\n", infoPtr->nCurrentTool);
+    TRACE("Show tooltip %d!\n", infoPtr->nCurrentTool);
     toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
 
     hdr.hwndFrom = hwnd;
@@ -219,10 +219,10 @@
     SendMessageA (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM)toolPtr->uId, (LPARAM)&hdr);
 
-    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
+    TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText));
 
     TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size);
-    TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
+    TRACE("size %d - %d\n", size.cx, size.cy);
 
     if (toolPtr->uFlags & TTF_CENTERTIP) {
 	RECT rc;
@@ -243,7 +243,7 @@
 
     /* FIXME: check position */
 
-    TRACE (tooltips, "pos %d - %d\n", rect.left, rect.top);
+    TRACE("pos %d - %d\n", rect.left, rect.top);
 
     rect.right = rect.left + size.cx;
     rect.bottom = rect.top + size.cy;
@@ -274,7 +274,7 @@
 	return;
 
     toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-    TRACE (tooltips, "Hide tooltip %d!\n", infoPtr->nCurrentTool);
+    TRACE("Hide tooltip %d!\n", infoPtr->nCurrentTool);
     KillTimer (hwnd, ID_TIMERPOP);
 
     hdr.hwndFrom = hwnd;
@@ -300,11 +300,11 @@
     NMHDR hdr;
 
     if (infoPtr->nTrackTool == -1) {
-	TRACE (tooltips, "invalid tracking tool (-1)!\n");
+	TRACE("invalid tracking tool (-1)!\n");
 	return;
     }
 
-    TRACE (tooltips, "show tracking tooltip pre %d!\n", infoPtr->nTrackTool);
+    TRACE("show tracking tooltip pre %d!\n", infoPtr->nTrackTool);
 
     TOOLTIPS_GetTipText (hwnd, infoPtr, infoPtr->nTrackTool);
 
@@ -313,7 +313,7 @@
 	return;
     }
 
-    TRACE (tooltips, "show tracking tooltip %d!\n", infoPtr->nTrackTool);
+    TRACE("show tracking tooltip %d!\n", infoPtr->nTrackTool);
     toolPtr = &infoPtr->tools[infoPtr->nTrackTool];
 
     hdr.hwndFrom = hwnd;
@@ -322,10 +322,10 @@
     SendMessageA (toolPtr->hwnd, WM_NOTIFY,
 		    (WPARAM)toolPtr->uId, (LPARAM)&hdr);
 
-    TRACE (tooltips, "\"%s\"\n", debugstr_w(infoPtr->szTipText));
+    TRACE("\"%s\"\n", debugstr_w(infoPtr->szTipText));
 
     TOOLTIPS_CalcTipSize (hwnd, infoPtr, &size);
-    TRACE (tooltips, "size %d - %d\n", size.cx, size.cy);
+    TRACE("size %d - %d\n", size.cx, size.cy);
 
     if (toolPtr->uFlags & TTF_ABSOLUTE) {
 	rect.left = infoPtr->xTrackPos;
@@ -360,7 +360,7 @@
 	    rect.left = rcTool.right;
     }
 
-    TRACE (tooltips, "pos %d - %d\n", rect.left, rect.top);
+    TRACE("pos %d - %d\n", rect.left, rect.top);
 
     rect.right = rect.left + size.cx;
     rect.bottom = rect.top + size.cy;
@@ -388,7 +388,7 @@
 	return;
 
     toolPtr = &infoPtr->tools[infoPtr->nTrackTool];
-    TRACE (tooltips, "hide tracking tooltip %d!\n", infoPtr->nTrackTool);
+    TRACE("hide tracking tooltip %d!\n", infoPtr->nTrackTool);
 
     hdr.hwndFrom = hwnd;
     hdr.idFrom = toolPtr->uId;
@@ -536,7 +536,7 @@
 	    return -1;
     }
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     return nTool;
 }
@@ -550,7 +550,7 @@
     infoPtr->bActive = (BOOL)wParam;
 
     if (infoPtr->bActive)
-	TRACE (tooltips, "activate!\n");
+	TRACE("activate!\n");
 
     if (!(infoPtr->bActive) && (infoPtr->nCurrentTool != -1)) 
 	TOOLTIPS_Hide (hwnd, infoPtr);
@@ -571,7 +571,7 @@
     if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEA)
 	return FALSE;
 
-    TRACE (tooltips, "add tool (%x) %x %d%s!\n",
+    TRACE("add tool (%x) %x %d%s!\n",
 	   hwnd, lpToolInfo->hwnd, lpToolInfo->uId,
 	   (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
 
@@ -599,17 +599,17 @@
     toolPtr->hinst  = lpToolInfo->hinst;
 
     if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) {
-	TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);
+	TRACE("add string id %x!\n", (int)lpToolInfo->lpszText);
 	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
 	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) {
-	    TRACE (tooltips, "add CALLBACK!\n");
+	    TRACE("add CALLBACK!\n");
 	    toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
 	}
 	else {
 	    INT len = lstrlenA (lpToolInfo->lpszText);
-	    TRACE (tooltips, "add text \"%s\"!\n", lpToolInfo->lpszText);
+	    TRACE("add text \"%s\"!\n", lpToolInfo->lpszText);
 	    toolPtr->lpszText =	COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
 	    lstrcpyAtoW (toolPtr->lpszText, lpToolInfo->lpszText);
 	}
@@ -635,7 +635,7 @@
 			    (HANDLE)lpttsi);
 	    }
 	    else
-		WARN (tooltips, "A window tool must only be listed once!\n");
+		WARN("A window tool must only be listed once!\n");
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
@@ -653,7 +653,7 @@
 	    else
 		lpttsi->uRefCount++;
 	}
-	TRACE (tooltips, "subclassing installed!\n");
+	TRACE("subclassing installed!\n");
     }
 
     return TRUE;
@@ -672,7 +672,7 @@
     if (lpToolInfo->cbSize < TTTOOLINFO_V1_SIZEW)
 	return FALSE;
 
-    TRACE (tooltips, "add tool (%x) %x %d%s!\n",
+    TRACE("add tool (%x) %x %d%s!\n",
 	   hwnd, lpToolInfo->hwnd, lpToolInfo->uId,
 	   (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
 
@@ -700,17 +700,17 @@
     toolPtr->hinst  = lpToolInfo->hinst;
 
     if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) {
-	TRACE (tooltips, "add string id %x!\n", (int)lpToolInfo->lpszText);
+	TRACE("add string id %x!\n", (int)lpToolInfo->lpszText);
 	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
 	if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) {
-	    TRACE (tooltips, "add CALLBACK!\n");
+	    TRACE("add CALLBACK!\n");
 	    toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
 	}
 	else {
 	    INT len = lstrlenW (lpToolInfo->lpszText);
-	    TRACE (tooltips, "add text \"%s\"!\n",
+	    TRACE("add text \"%s\"!\n",
 		   debugstr_w(lpToolInfo->lpszText));
 	    toolPtr->lpszText =	COMCTL32_Alloc ((len + 1)*sizeof(WCHAR));
 	    lstrcpyW (toolPtr->lpszText, lpToolInfo->lpszText);
@@ -737,7 +737,7 @@
 			    (HANDLE)lpttsi);
 	    }
 	    else
-		WARN (tooltips, "A window tool must only be listed once!\n");
+		WARN("A window tool must only be listed once!\n");
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
@@ -755,7 +755,7 @@
 	    else
 		lpttsi->uRefCount++;
 	}
-	TRACE (tooltips, "subclassing installed!\n");
+	TRACE("subclassing installed!\n");
     }
 
     return TRUE;
@@ -780,7 +780,7 @@
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     /* delete text string */
     toolPtr = &infoPtr->tools[nTool]; 
@@ -801,7 +801,7 @@
 		COMCTL32_Free (&lpttsi);
 	    }
 	    else
-		ERR (tooltips, "Invalid data handle!\n");
+		ERR("Invalid data handle!\n");
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
@@ -817,7 +817,7 @@
 		    lpttsi->uRefCount--;
 	    }
 	    else
-		ERR (tooltips, "Invalid data handle!\n");
+		ERR("Invalid data handle!\n");
 	}
     }
 
@@ -866,7 +866,7 @@
     nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     /* delete text string */
     toolPtr = &infoPtr->tools[nTool]; 
@@ -887,7 +887,7 @@
 		COMCTL32_Free (&lpttsi);
 	    }
 	    else
-		ERR (tooltips, "Invalid data handle!\n");
+		ERR("Invalid data handle!\n");
 	}
 	else {
 	    LPTT_SUBCLASS_INFO lpttsi =
@@ -903,7 +903,7 @@
 		    lpttsi->uRefCount--;
 	    }
 	    else
-		ERR (tooltips, "Invalid data handle!\n");
+		ERR("Invalid data handle!\n");
 	}
     }
 
@@ -949,7 +949,7 @@
     if (uIndex >= infoPtr->uNumTools)
 	return FALSE;
 
-    TRACE (tooltips, "index=%u\n", uIndex);
+    TRACE("index=%u\n", uIndex);
 
     toolPtr = &infoPtr->tools[uIndex];
 
@@ -984,7 +984,7 @@
     if (uIndex >= infoPtr->uNumTools)
 	return FALSE;
 
-    TRACE (tooltips, "index=%u\n", uIndex);
+    TRACE("index=%u\n", uIndex);
 
     toolPtr = &infoPtr->tools[uIndex];
 
@@ -1212,7 +1212,7 @@
     if (nTool == -1)
 	return FALSE;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     toolPtr = &infoPtr->tools[nTool];
 
@@ -1249,7 +1249,7 @@
     if (nTool == -1)
 	return FALSE;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     toolPtr = &infoPtr->tools[nTool];
 
@@ -1282,7 +1282,7 @@
     if (nTool == -1)
 	return FALSE;
 
-    TRACE (tooltips, "tool %d!\n", nTool);
+    TRACE("tool %d!\n", nTool);
 
     /* copy tool data */
     if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOA)) {
@@ -1317,7 +1317,7 @@
     if (nTool == -1)
 	return FALSE;
 
-    TRACE (tooltips, "tool %d!\n", nTool);
+    TRACE("tool %d!\n", nTool);
 
     /* copy tool data */
     if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOW)) {
@@ -1398,7 +1398,7 @@
     POINT pt;
 
     if (lParam == 0) {
-	ERR (tooltips, "lpMsg == NULL!\n");
+	ERR("lpMsg == NULL!\n");
 	return 0;
     }
 
@@ -1413,7 +1413,7 @@
 	    ScreenToClient (lpMsg->hwnd, &pt);
 	    infoPtr->nOldTool = infoPtr->nTool;
 	    infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt);
-	    TRACE (tooltips, "tool (%x) %d %d\n",
+	    TRACE("tool (%x) %d %d\n",
 		   hwnd, infoPtr->nOldTool, infoPtr->nTool);
 	    TOOLTIPS_Hide (hwnd, infoPtr);
 	    break;
@@ -1423,24 +1423,24 @@
 	    ScreenToClient (lpMsg->hwnd, &pt);
 	    infoPtr->nOldTool = infoPtr->nTool;
 	    infoPtr->nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lpMsg->hwnd, &pt);
-	    TRACE (tooltips, "tool (%x) %d %d\n",
+	    TRACE("tool (%x) %d %d\n",
 		   hwnd, infoPtr->nOldTool, infoPtr->nTool);
-	    TRACE (tooltips, "WM_MOUSEMOVE (%04x %ld %ld)\n",
+	    TRACE("WM_MOUSEMOVE (%04x %ld %ld)\n",
 		   hwnd, pt.x, pt.y);
 	    if ((infoPtr->bActive) && (infoPtr->nTool != infoPtr->nOldTool)) {
 		if (infoPtr->nOldTool == -1) {
 		    SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nInitialTime, 0);
-		    TRACE (tooltips, "timer 1 started!\n");
+		    TRACE("timer 1 started!\n");
 		}
 		else {
 		    TOOLTIPS_Hide (hwnd, infoPtr);
 		    SetTimer (hwnd, ID_TIMERSHOW, infoPtr->nReshowTime, 0);
-		    TRACE (tooltips, "timer 2 started!\n");
+		    TRACE("timer 2 started!\n");
 		}
 	    }
 	    if (infoPtr->nCurrentTool != -1) {
 		SetTimer (hwnd, ID_TIMERLEAVE, 100, 0);
-		TRACE (tooltips, "timer 3 started!\n");
+		TRACE("timer 3 started!\n");
 	    }
 	    break;
     }
@@ -1553,7 +1553,7 @@
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     toolPtr = &infoPtr->tools[nTool];
 
@@ -1565,7 +1565,7 @@
     toolPtr->hinst  = lpToolInfo->hinst;
 
     if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) {
-	TRACE (tooltips, "set string id %x!\n", (INT)lpToolInfo->lpszText);
+	TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText);
 	toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
@@ -1607,7 +1607,7 @@
     nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     toolPtr = &infoPtr->tools[nTool];
 
@@ -1619,7 +1619,7 @@
     toolPtr->hinst  = lpToolInfo->hinst;
 
     if ((lpToolInfo->hinst) && (HIWORD((INT)lpToolInfo->lpszText) == 0)) {
-	TRACE (tooltips, "set string id %x!\n", (INT)lpToolInfo->lpszText);
+	TRACE("set string id %x!\n", (INT)lpToolInfo->lpszText);
 	toolPtr->lpszText = lpToolInfo->lpszText;
     }
     else if (lpToolInfo->lpszText) {
@@ -1660,7 +1660,7 @@
 	/* activate */
 	infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
 	if (infoPtr->nTrackTool != -1) {
-	    TRACE (tooltips, "activated!\n");
+	    TRACE("activated!\n");
 	    infoPtr->bTrackActive = TRUE;
 	    TOOLTIPS_TrackShow (hwnd, infoPtr);
 	}
@@ -1672,7 +1672,7 @@
 	infoPtr->bTrackActive = FALSE;
 	infoPtr->nTrackTool = -1;
 
-	TRACE (tooltips, "deactivated!\n");
+	TRACE("deactivated!\n");
     }
 
     return 0;
@@ -1688,7 +1688,7 @@
     infoPtr->yTrackPos = (INT)HIWORD(lParam);
 
     if (infoPtr->bTrackActive) {
-	TRACE (tooltips, "[%d %d]\n",
+	TRACE("[%d %d]\n",
 	       infoPtr->xTrackPos, infoPtr->yTrackPos);
 
 	TOOLTIPS_TrackShow (hwnd, infoPtr);
@@ -1726,7 +1726,7 @@
     nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
     if (nTool == -1) return 0;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     toolPtr = &infoPtr->tools[nTool];
 
@@ -1779,7 +1779,7 @@
     if (nTool == -1)
 	return 0;
 
-    TRACE (tooltips, "tool %d\n", nTool);
+    TRACE("tool %d\n", nTool);
 
     toolPtr = &infoPtr->tools[nTool];
 
@@ -1858,11 +1858,11 @@
     nResult = (INT) SendMessageA (GetParent (hwnd), WM_NOTIFYFORMAT,
 				  (WPARAM)hwnd, (LPARAM)NF_QUERY);
     if (nResult == NFR_ANSI)
-	TRACE (tooltips, " -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
+	TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
     else if (nResult == NFR_UNICODE)
-	FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
+	FIXME(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
     else
-	FIXME (tooltips, " -- WM_NOTIFYFORMAT returns: error!\n");
+	FIXME(" -- WM_NOTIFYFORMAT returns: error!\n");
 
     SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
 
@@ -1971,11 +1971,11 @@
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
     INT nTool = (infoPtr->bTrackActive) ? infoPtr->nTrackTool : infoPtr->nTool;
 
-    TRACE (tooltips, " nTool=%d\n", nTool);
+    TRACE(" nTool=%d\n", nTool);
 
     if ((nTool > -1) && (nTool < infoPtr->uNumTools)) {
 	if (infoPtr->tools[nTool].uFlags & TTF_TRANSPARENT) {
-	    TRACE (tooltips, "-- in transparent mode!\n");
+	    TRACE("-- in transparent mode!\n");
 	    return HTTRANSPARENT;
 	}
     }
@@ -2006,7 +2006,7 @@
     infoPtr->hFont = (HFONT)wParam;
 
     if ((LOWORD(lParam)) & (infoPtr->nCurrentTool != -1)) {
-	FIXME (tooltips, "full redraw needed!\n");
+	FIXME("full redraw needed!\n");
     }
 
     return 0;
@@ -2065,7 +2065,7 @@
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
 
-    TRACE (tooltips, "timer %d (%x) expired!\n", wParam, hwnd);
+    TRACE("timer %d (%x) expired!\n", wParam, hwnd);
 
     switch (wParam)
     {
@@ -2128,7 +2128,7 @@
 	    infoPtr = TOOLTIPS_GetInfoPtr(lpttsi->hwndToolTip);
 		nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd);
 
-		TRACE (tooltips, "subclassed mouse message %04x\n", uMsg);
+		TRACE("subclassed mouse message %04x\n", uMsg);
 		infoPtr->nOldTool = infoPtr->nTool;
 		infoPtr->nTool = nTool;
 	    TOOLTIPS_Hide (lpttsi->hwndToolTip, infoPtr);
@@ -2138,7 +2138,7 @@
 	    infoPtr = TOOLTIPS_GetInfoPtr (lpttsi->hwndToolTip);
 		nTool = TOOLTIPS_GetToolFromMessage (infoPtr, hwnd);
 
-		TRACE (tooltips, "subclassed WM_MOUSEMOVE\n");
+		TRACE("subclassed WM_MOUSEMOVE\n");
 		infoPtr->nOldTool = infoPtr->nTool;
 		infoPtr->nTool = nTool;
 
@@ -2147,18 +2147,18 @@
 		    if (infoPtr->nOldTool == -1) {
 		    SetTimer (hwnd, ID_TIMERSHOW,
 				    infoPtr->nInitialTime, 0);
-			TRACE (tooltips, "timer 1 started!\n");
+			TRACE("timer 1 started!\n");
 		    }
 		    else {
 		    TOOLTIPS_Hide (lpttsi->hwndToolTip, infoPtr);
 		    SetTimer (hwnd, ID_TIMERSHOW,
 				infoPtr->nReshowTime, 0);
-			TRACE (tooltips, "timer 2 started!\n");
+			TRACE("timer 2 started!\n");
 		    }
 		}
 		if (infoPtr->nCurrentTool != -1) {
 		SetTimer (hwnd, ID_TIMERLEAVE, 100, 0);
-		    TRACE (tooltips, "timer 3 started!\n");
+		    TRACE("timer 3 started!\n");
 		}
 	    break;
     }
@@ -2338,7 +2338,7 @@
 
 	default:
 	    if (uMsg >= WM_USER)
-		ERR (tooltips, "unknown msg %04x wp=%08x lp=%08lx\n",
+		ERR("unknown msg %04x wp=%08x lp=%08lx\n",
 		     uMsg, wParam, lParam);
 	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c
index 80d5f62..cb4eb36 100644
--- a/dlls/comctl32/trackbar.c
+++ b/dlls/comctl32/trackbar.c
@@ -27,7 +27,7 @@
 #include "winbase.h"
 #include "commctrl.h"
 #include "trackbar.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(trackbar)
 
@@ -105,7 +105,7 @@
     else if (pos < infoPtr->nRangeMin)
         pos = infoPtr->nRangeMin;
 
-    TRACE (trackbar,"%.2f\n",pos);
+    TRACE("%.2f\n",pos);
     return pos;
 }
 
@@ -764,14 +764,14 @@
 	hwndTemp = infoPtr->hwndBuddyLA;
 	infoPtr->hwndBuddyLA = (HWND)lParam;
 
-	FIXME (trackbar, "move buddy!\n");
+	FIXME("move buddy!\n");
     }
     else {
         /* buddy is right or below */
         hwndTemp = infoPtr->hwndBuddyRB;
         infoPtr->hwndBuddyRB = (HWND)lParam;
 
-        FIXME (trackbar, "move buddy!\n");
+        FIXME("move buddy!\n");
     }
 
     TRACKBAR_AlignBuddies (hwnd, infoPtr);
@@ -1142,7 +1142,7 @@
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
 
-    TRACE (trackbar,"\n");
+    TRACE("\n");
 
     infoPtr->bFocus = FALSE;
     infoPtr->flags &= ~TB_DRAG_MODE;
@@ -1287,7 +1287,7 @@
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
 
-    TRACE (trackbar,"\n");
+    TRACE("\n");
     infoPtr->bFocus = TRUE;
 
     InvalidateRect (hwnd, NULL, FALSE);
@@ -1311,7 +1311,7 @@
 static BOOL
 TRACKBAR_SendNotify (HWND hwnd, UINT code)
 {
-    TRACE (trackbar, "%x\n",code);
+    TRACE("%x\n",code);
 
     if (GetWindowLongA (hwnd, GWL_STYLE) & TBS_VERT) 
     	return (BOOL) SendMessageA (GetParent (hwnd), 
@@ -1331,7 +1331,7 @@
     DOUBLE dragPos;
     char buf[80];
 			
-    TRACE (trackbar, "%x\n",wParam);
+    TRACE("%x\n",wParam);
 
     if (dwStyle & TBS_VERT)
         clickPlace=(SHORT)HIWORD(lParam);
@@ -1388,7 +1388,7 @@
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr (hwnd);
     INT pos;
 
-    TRACE (trackbar, "%x\n",wParam);
+    TRACE("%x\n",wParam);
 
     pos=infoPtr->nPos;
     switch (wParam) {
@@ -1619,7 +1619,7 @@
 
     default:
         if (uMsg >= WM_USER)
-            ERR (trackbar, "unknown msg %04x wp=%08x lp=%08lx\n",
+            ERR("unknown msg %04x wp=%08x lp=%08lx\n",
                  uMsg, wParam, lParam);
         return DefWindowProcA (hwnd, uMsg, wParam, lParam);
     }
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 0e2099c..059ef51 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -44,7 +44,7 @@
 #include "wingdi.h"
 #include "commctrl.h"
 #include "treeview.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(treeview)
 
@@ -323,7 +323,7 @@
 	parentItem=& infoPtr->items [(INT)wineItem->parent];
 	switch (parentItem->cChildren) {
 		case I_CHILDRENCALLBACK: 
-				FIXME (treeview,"we don't handle I_CHILDRENCALLBACK yet\n");
+				FIXME("we don't handle I_CHILDRENCALLBACK yet\n");
 				break;
 		case 1:
 			parentItem->cChildren=0;
@@ -390,7 +390,7 @@
 {
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   if (infoPtr==NULL) return 0;
 
   if ((INT)wParam == TVSIL_NORMAL) 
@@ -407,7 +407,7 @@
     TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
     HIMAGELIST himlTemp;
 
-    TRACE (treeview,"\n");
+    TRACE("\n");
     switch ((INT)wParam) {
 	case TVSIL_NORMAL:
 	    himlTemp = infoPtr->himlNormal;
@@ -432,7 +432,7 @@
   INT cx,cy,prevHeight=infoPtr->uItemHeight;
   HDC hdc;
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   if (wParam==-1) {
 	hdc=GetDC (hwnd);
 	infoPtr->uItemHeight=-1;
@@ -454,7 +454,7 @@
 {
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
   
-  TRACE (treeview,"\n");
+  TRACE("\n");
   return infoPtr->uItemHeight;
 }
   
@@ -464,7 +464,7 @@
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
   COLORREF prevColor=infoPtr->clrText;
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   infoPtr->clrText=(COLORREF) lParam;
   return (LRESULT) prevColor;
 }
@@ -474,7 +474,7 @@
 {
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 	
-  TRACE (treeview,"\n");
+  TRACE("\n");
   return (LRESULT) infoPtr->clrText;
 }
 
@@ -484,7 +484,7 @@
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
   COLORREF prevColor=infoPtr->clrBk;
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   infoPtr->clrBk=(COLORREF) lParam;
   return (LRESULT) prevColor;
 }
@@ -494,7 +494,7 @@
 {
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 	
-  TRACE (treeview,"\n");
+  TRACE("\n");
   return (LRESULT) infoPtr->clrBk;
 }
 
@@ -530,7 +530,7 @@
 
 		cditem=TREEVIEW_SendCustomDrawItemNotify (hwnd, hdc, wineItem, drawmode);
 
-		TRACE (treeview,"cditem:%d\n",cditem);
+		TRACE("cditem:%d\n",cditem);
 
 		if (cditem & CDRF_SKIPDEFAULT) 
 			return;
@@ -733,7 +733,7 @@
     }
 
     if (wineItem->pszText== LPSTR_TEXTCALLBACKA) {
-      TRACE (treeview,"LPSTR_TEXTCALLBACK\n");
+      TRACE("LPSTR_TEXTCALLBACK\n");
       TREEVIEW_SendDispInfoNotify (hwnd, wineItem, TVN_GETDISPINFO, TVIF_TEXT);
     }
 
@@ -798,7 +798,7 @@
   HTREEITEM     *iItem;
   LPRECT        lpRect   = (LPRECT)lParam;
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   /* 
    * validate parameters
    */
@@ -832,7 +832,7 @@
     lpRect->top	    = wineItem->rect.top;
   }
 
-  TRACE (treeview,"[L:%d R:%d T:%d B:%d]\n", 
+  TRACE("[L:%d R:%d T:%d B:%d]\n", 
       lpRect->left,lpRect->right,
 			lpRect->top,lpRect->bottom);
 
@@ -860,7 +860,7 @@
 
   tvItem=(LPTVITEMEXA) lParam;
   iItem=(INT)tvItem->hItem;
-  TRACE (treeview,"item %d,mask %x\n",iItem,tvItem->mask);
+  TRACE("item %d,mask %x\n",iItem,tvItem->mask);
 
   wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)iItem);
   if (!wineItem) return FALSE;
@@ -875,7 +875,7 @@
 
   if (tvItem->mask & TVIF_INTEGRAL) {
         wineItem->iIntegral=tvItem->iIntegral; 
-        FIXME (treeview," TVIF_INTEGRAL not supported yet\n");
+        FIXME(" TVIF_INTEGRAL not supported yet\n");
   }
 
   if (tvItem->mask & TVIF_PARAM) {
@@ -925,7 +925,7 @@
     INT viewtop,viewbottom,viewleft,viewright;
     TREEVIEW_ITEM *wineItem, *prevItem;
 
-    TRACE (treeview,"\n");
+    TRACE("\n");
 
 	hdc=GetDC (hwnd);
 
@@ -967,7 +967,7 @@
     wineItem=NULL;
     indent=0;
     x=y=0;
-    TRACE (treeview, "[%d %d %d %d]\n",viewtop,viewbottom,viewleft,viewright);
+    TRACE("[%d %d %d %d]\n",viewtop,viewbottom,viewleft,viewright);
 
     while (iItem) {
 		prevItem=wineItem;
@@ -1065,7 +1065,7 @@
 								(hwnd, CDDS_POSTPAINT, hdc, rect);
 
     ReleaseDC (hwnd, hdc);
-    TRACE (treeview,"done\n");
+    TRACE("done\n");
 }
 
 
@@ -1074,7 +1074,7 @@
 {
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
-  TRACE (treeview, " %d\n",wParam);
+  TRACE(" %d\n",wParam);
   if (!infoPtr) return FALSE;
 
   switch (wParam) {
@@ -1088,7 +1088,7 @@
 		infoPtr->Timer &= ~TV_EDIT_TIMER_SET;
 		return 0;
 	default:
-		ERR (treeview,"got unknown timer\n");
+		ERR("got unknown timer\n");
  }
 		
  return 1;
@@ -1101,7 +1101,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview,"\n");
+ TRACE("\n");
  if (infoPtr->Timer & TV_REFRESH_TIMER_SET) {
 	KillTimer (hwnd, TV_REFRESH_TIMER);
  }
@@ -1128,7 +1128,7 @@
 
    if (tvItem->mask & TVIF_CHILDREN) {
 		if (TVIF_CHILDREN==I_CHILDRENCALLBACK) 
-			FIXME (treeview,"I_CHILDRENCALLBACK not supported\n");
+			FIXME("I_CHILDRENCALLBACK not supported\n");
         tvItem->cChildren=wineItem->cChildren;
    }
 
@@ -1142,7 +1142,7 @@
 
    if (tvItem->mask & TVIF_INTEGRAL) {
         tvItem->iIntegral=wineItem->iIntegral; 
-		FIXME (treeview," TVIF_INTEGRAL not supported yet\n");
+		FIXME(" TVIF_INTEGRAL not supported yet\n");
    }
 
    if (tvItem->mask & TVIF_PARAM) {
@@ -1160,14 +1160,14 @@
    if (tvItem->mask & TVIF_TEXT) {
 	if (wineItem->pszText == LPSTR_TEXTCALLBACKA) {
 	    tvItem->pszText = LPSTR_TEXTCALLBACKA;  /* FIXME:send notification? */
-		ERR (treeview," GetItem called with LPSTR_TEXTCALLBACK\n");
+		ERR(" GetItem called with LPSTR_TEXTCALLBACK\n");
 	}
 	else if (wineItem->pszText) {
 	    lstrcpynA (tvItem->pszText, wineItem->pszText, tvItem->cchTextMax);
 	}
    }
 
-  TRACE(treeview,"item %d<%p>, txt %p, img %p, action %x\n", 
+  TRACE("item %d<%p>, txt %p, img %p, action %x\n", 
     iItem,
     tvItem, 
     tvItem->pszText, 
@@ -1209,7 +1209,7 @@
 					break;
 	}
   if (retval) {
-  		TRACE (treeview,"flags:%x, returns %u\n", flag, retval);
+  		TRACE("flags:%x, returns %u\n", flag, retval);
 		return retval;
   }
  
@@ -1238,17 +1238,17 @@
 	case TVGN_PREVIOUSVISIBLE: 
 					returnItem=TREEVIEW_GetPrevListItem (infoPtr, wineItem);
 					break;
-	default:		FIXME (treeview,"Unknown msg %x,item %x\n", flag,iItem);
+	default:		FIXME("Unknown msg %x,item %x\n", flag,iItem);
 					break;
 	}
 
   if (returnItem) {
-		  TRACE (treeview,"flags:%x, item %d;returns %d\n", flag, iItem,
+		  TRACE("flags:%x, item %d;returns %d\n", flag, iItem,
 							(INT)returnItem->hItem);
 		  return (INT)returnItem->hItem;
   }
 
-  TRACE (treeview,"flags:%x, item %d;returns %d\n", flag, iItem,retval);
+  TRACE("flags:%x, item %d;returns %d\n", flag, iItem,retval);
   return retval;
 }
 
@@ -1258,7 +1258,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview," %d\n",infoPtr->uNumItems);
+ TRACE(" %d\n",infoPtr->uNumItems);
  return (LRESULT) infoPtr->uNumItems;
 }
 
@@ -1277,10 +1277,10 @@
   TREEVIEW_ITEM *upSibling      = NULL;
 
   if (newItem == NULL)
-    ERR(treeview, "NULL newItem, impossible condition\n");
+    ERR("NULL newItem, impossible condition\n");
 
   if (parent == NULL)
-    ERR(treeview, "NULL parent, impossible condition\n");
+    ERR("NULL parent, impossible condition\n");
 
   if (sibling != NULL) /* Insert before this sibling for this parent */
   { 
@@ -1324,10 +1324,10 @@
   TREEVIEW_ITEM *sibling        = NULL;
 
   if (newItem == NULL)
-    ERR(treeview, "NULL newItem, impossible condition\n");
+    ERR("NULL newItem, impossible condition\n");
 
   if (parent == NULL)
-    ERR(treeview, "NULL parent, impossible condition\n");
+    ERR("NULL parent, impossible condition\n");
 
   if (upSibling != NULL) /* Insert after this upsibling for this parent */
   { 
@@ -1531,10 +1531,10 @@
 
   if (TRACE_ON(treeview)) { 
     for (i=0; i<infoPtr->uNumPtrsAlloced>>5; i++) 
-	    TRACE (treeview,"%8x\n",infoPtr->freeList[i]);
+	    TRACE("%8x\n",infoPtr->freeList[i]);
   }
 
-  if (!iItem) ERR (treeview, "Argh -- can't find free item.\n");
+  if (!iItem) ERR("Argh -- can't find free item.\n");
 
   /* 
    * Find the parent item of the new item 
@@ -1575,7 +1575,7 @@
      */
     if (tvItem->pszText!=LPSTR_TEXTCALLBACKA) 
     {
-      TRACE (treeview,"(%p,%s)\n", &tvItem->pszText, tvItem->pszText); 
+      TRACE("(%p,%s)\n", &tvItem->pszText, tvItem->pszText); 
       len = lstrlenA (tvItem->pszText)+1;
       wineItem->pszText= COMCTL32_Alloc (len+1);
       lstrcpyA (wineItem->pszText, tvItem->pszText);
@@ -1583,7 +1583,7 @@
     }
     else 
     {
-      TRACE (treeview,"LPSTR_TEXTCALLBACK\n");
+      TRACE("LPSTR_TEXTCALLBACK\n");
       wineItem->pszText = LPSTR_TEXTCALLBACKA;
       wineItem->cchTextMax = 0;
     }
@@ -1687,7 +1687,7 @@
                 sibItem=&infoPtr->items [(INT)sibItem->sibling];
               }
 			if (sibItem->hItem!=ptdi->hInsertAfter) {
-			 ERR (treeview, "tried to insert item after nonexisting handle.\n");
+			 ERR("tried to insert item after nonexisting handle.\n");
 			 break;
 			}
 			prevsib=sibItem;
@@ -1705,7 +1705,7 @@
 
 /* Fill in info structure */
 
-   TRACE (treeview,"new item %d; parent %d, mask %x\n", iItem, 
+   TRACE("new item %d; parent %d, mask %x\n", iItem, 
 			(INT)wineItem->parent,tvItem->mask);
 
    wineItem->mask=tvItem->mask;
@@ -1714,7 +1714,7 @@
    if (tvItem->mask & TVIF_CHILDREN) {
 	 wineItem->cChildren=tvItem->cChildren;
 	 if (tvItem->cChildren==I_CHILDRENCALLBACK) 
-			FIXME (treeview," I_CHILDRENCALLBACK not supported\n");
+			FIXME(" I_CHILDRENCALLBACK not supported\n");
 	}
 
   wineItem->expandBox.left   = 0; /* Initialize the expandBox */
@@ -1735,7 +1735,7 @@
 	wineItem->iSelectedImage=tvItem->iSelectedImage;
 
    if (tvItem->mask & TVIF_STATE) {
-     TRACE(treeview, "Changing item state from %d to %d\n", 
+     TRACE("Changing item state from %d to %d\n", 
        wineItem->state, 
        tvItem->state);
 	wineItem->state=tvItem->state;
@@ -1759,7 +1759,7 @@
   INT iItem;
   TREEVIEW_ITEM *wineItem;
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   if (!infoPtr) return FALSE;
 
   if (lParam == (INT)TVI_ROOT) {
@@ -1768,7 +1768,7 @@
   	iItem= (INT) lParam;
   	wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)iItem);
   	if (!wineItem) return FALSE;
-    TRACE (treeview,"%s\n",wineItem->pszText);
+    TRACE("%s\n",wineItem->pszText);
 	TREEVIEW_RemoveItem (hwnd, wineItem);
   }
 
@@ -1784,7 +1784,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview,"\n");
+ TRACE("\n");
  return infoPtr->uIndent;
 }
 
@@ -1794,7 +1794,7 @@
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
   INT newIndent;
    
-  TRACE (treeview,"\n");
+  TRACE("\n");
   newIndent=(INT) wParam;
   if (newIndent < MINIMUM_INDENT) newIndent=MINIMUM_INDENT;
   infoPtr->uIndent=newIndent;
@@ -1808,7 +1808,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview,"\n");
+ TRACE("\n");
  return infoPtr->hwndToolTip;
 }
 
@@ -1820,7 +1820,7 @@
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
  HWND prevToolTip;
 
- TRACE (treeview,"\n");
+ TRACE("\n");
  prevToolTip=infoPtr->hwndToolTip;
  infoPtr->hwndToolTip= (HWND) wParam;
 
@@ -1874,7 +1874,7 @@
 TREEVIEW_Command (HWND hwnd, WPARAM wParam, LPARAM lParam)
 
 {
-  TRACE (treeview, "%x %ld\n",wParam, lParam);
+  TRACE("%x %ld\n",wParam, lParam);
  
   switch (HIWORD(wParam)) 
   {
@@ -1937,7 +1937,7 @@
     infoPtr->uTotalWidth  = LOWORD (lParam);
   	infoPtr->uTotalHeight = HIWORD (lParam);
   } else {
-  	FIXME (treeview,"WM_SIZE flag %x %lx not handled\n", wParam, lParam);
+  	FIXME("WM_SIZE flag %x %lx not handled\n", wParam, lParam);
   }
 
   TREEVIEW_QueueRefresh (hwnd);
@@ -1951,7 +1951,7 @@
 {
   LPSTYLESTRUCT lpss=(LPSTYLESTRUCT) lParam;
 
-  TRACE (treeview,"(%x %lx)\n",wParam,lParam);
+  TRACE("(%x %lx)\n",wParam,lParam);
   
   if (wParam & (GWL_STYLE)) 
 	 SetWindowLongA( hwnd, GWL_STYLE, lpss->styleNew);
@@ -1969,19 +1969,19 @@
     TEXTMETRICA tm;
 	HDC hdc;
   
-    TRACE (treeview,"wnd %x\n",hwnd);
+    TRACE("wnd %x\n",hwnd);
       /* allocate memory for info structure */
       infoPtr = (TREEVIEW_INFO *) COMCTL32_Alloc (sizeof(TREEVIEW_INFO));
 
      SetWindowLongA( hwnd, 0, (DWORD)infoPtr);
 
     if (infoPtr == NULL) {
-		ERR (treeview, "could not allocate info memory!\n");
+		ERR("could not allocate info memory!\n");
 		return 0;
     }
 
     if ((TREEVIEW_INFO*) GetWindowLongA( hwnd, 0) != infoPtr) {
-		ERR (treeview, "pointer assignment error!\n");
+		ERR("pointer assignment error!\n");
 		return 0;
     }
 
@@ -2076,7 +2076,7 @@
 {
    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
      
-   TRACE (treeview,"\n");
+   TRACE("\n");
    TREEVIEW_RemoveTree (hwnd);
    if (infoPtr->Timer & TV_REFRESH_TIMER_SET) 
         KillTimer (hwnd, TV_REFRESH_TIMER);
@@ -2094,12 +2094,12 @@
     HDC hdc;
     PAINTSTRUCT ps;
 
-    TRACE (treeview,"\n");
+    TRACE("\n");
     hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam;
     TREEVIEW_Refresh (hwnd);
     if(!wParam)
         EndPaint (hwnd, &ps);
-    TRACE (treeview,"done\n");
+    TRACE("done\n");
       
     return DefWindowProcA (hwnd, WM_PAINT, wParam, lParam);
 }
@@ -2127,7 +2127,7 @@
     HBRUSH hBrush = CreateSolidBrush (infoPtr->clrBk);
     RECT rect;
 
-    TRACE (treeview,"\n");
+    TRACE("\n");
     GetClientRect (hwnd, &rect);
     FillRect ((HDC)wParam, &rect, hBrush);
     DeleteObject (hBrush);
@@ -2150,7 +2150,7 @@
 {
     NMHDR nmhdr;
 
-    TRACE (treeview, "%x\n",code);
+    TRACE("%x\n",code);
     nmhdr.hwndFrom = hwnd;
     nmhdr.idFrom   =  GetWindowLongA( hwnd, GWL_ID);
     nmhdr.code     = code;
@@ -2170,7 +2170,7 @@
   NMTREEVIEWA nmhdr;
   TREEVIEW_ITEM  *wineItem;
 
-  TRACE (treeview,"code:%x action:%x olditem:%x newitem:%x\n",
+  TRACE("code:%x action:%x olditem:%x newitem:%x\n",
 		  code,action,(INT)oldItem,(INT)newItem);
   nmhdr.hdr.hwndFrom = hwnd;
   nmhdr.hdr.idFrom =  GetWindowLongA( hwnd, GWL_ID);
@@ -2222,7 +2222,7 @@
   NMTREEVIEWA nmhdr;
   TREEVIEW_ITEM  *wineItem;
 
-  TRACE (treeview,"code:%x dragitem:%x\n", code,(INT)dragItem);
+  TRACE("code:%x dragitem:%x\n", code,(INT)dragItem);
 
   nmhdr.hdr.hwndFrom = hwnd;
   nmhdr.hdr.idFrom =  GetWindowLongA( hwnd, GWL_ID);
@@ -2252,7 +2252,7 @@
   BOOL retval;
   char *buf;
 
-  TRACE (treeview,"item %d, action %x, state %d\n",
+  TRACE("item %d, action %x, state %d\n",
     (INT)wineItem->hItem,
     what,
     (INT)wineItem->state);
@@ -2278,7 +2278,7 @@
 		if (buf==tvdi.item.pszText) {
 			wineItem->cchTextMax = 128;
 		} else { 
-			TRACE (treeview,"user-supplied buffer\n");
+			TRACE("user-supplied buffer\n");
 			COMCTL32_Free (buf);
 			wineItem->cchTextMax = 0;
 		}
@@ -2303,7 +2303,7 @@
   NMTVCUSTOMDRAW nmcdhdr;
   LPNMCUSTOMDRAW nmcd;
 
-  TRACE (treeview,"drawstage:%lx hdc:%x\n", dwDrawStage, hdc);
+  TRACE("drawstage:%lx hdc:%x\n", dwDrawStage, hdc);
 
   nmcd= & nmcdhdr.nmcd;
   nmcd->hdr.hwndFrom = hwnd;
@@ -2366,7 +2366,7 @@
  nmcdhdr.clrTextBk= infoPtr->clrBk;
  nmcdhdr.iLevel   = wineItem->iLevel;
 
- TRACE (treeview,"drawstage:%lx hdc:%x item:%lx, itemstate:%x\n",
+ TRACE("drawstage:%lx hdc:%x item:%lx, itemstate:%x\n",
 		  dwDrawStage, hdc, dwItemSpec, uItemState);
 
  return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
@@ -2399,14 +2399,14 @@
   if (!wineItem->cChildren) 
     return 0;
 
-  TRACE (treeview,"For (%s) flags:%x item:%d state:%d\n", 
+  TRACE("For (%s) flags:%x item:%d state:%d\n", 
     wineItem->pszText,
     flag, 
     expand,
     wineItem->state);
 
   if (wineItem->cChildren==I_CHILDRENCALLBACK) {
-    FIXME (treeview,"we don't handle I_CHILDRENCALLBACK yet\n");
+    FIXME("we don't handle I_CHILDRENCALLBACK yet\n");
     return 0;
   }
 
@@ -2421,7 +2421,7 @@
   switch (flag) 
   {
     case TVE_COLLAPSERESET: 
-      TRACE(treeview, "  case TVE_COLLAPSERESET\n");
+      TRACE("  case TVE_COLLAPSERESET\n");
       if (!wineItem->state & TVIS_EXPANDED) 
         return 0;
 
@@ -2430,7 +2430,7 @@
        break;
 
     case TVE_COLLAPSE: 
-      TRACE(treeview, "  case TVE_COLLAPSE\n");
+      TRACE("  case TVE_COLLAPSE\n");
       if (!wineItem->state & TVIS_EXPANDED) 
         return 0;
 
@@ -2438,15 +2438,15 @@
       break;
 
     case TVE_EXPAND: 
-      TRACE(treeview, "  case TVE_EXPAND\n");
+      TRACE("  case TVE_EXPAND\n");
       if (wineItem->state & TVIS_EXPANDED) 
         return 0;
 
-      TRACE(treeview, "  is not expanded...\n");
+      TRACE("  is not expanded...\n");
      
       if (!(wineItem->state & TVIS_EXPANDEDONCE))  
       { 
-        TRACE(treeview, "  and has never been expanded...\n");
+        TRACE("  and has never been expanded...\n");
         wineItem->state |= TVIS_EXPANDED;
 
         /* this item has never been expanded */
@@ -2457,7 +2457,7 @@
               0, 
               (HTREEITEM)expand))
         {
-          TRACE(treeview, "  TVN_ITEMEXPANDING returned TRUE, exiting...\n");
+          TRACE("  TVN_ITEMEXPANDING returned TRUE, exiting...\n");
           return FALSE;   
         }
 
@@ -2472,14 +2472,14 @@
         wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)expand);
         if (! wineItem) 
         { 
-          ERR(treeview, 
+          ERR(
             "Catastropic situation, cannot retreive item #%d\n",
             expand);
           return FALSE;
         }
 
         wineItem->state |= TVIS_EXPANDEDONCE;
-        TRACE(treeview, "  TVN_ITEMEXPANDING sent...\n");
+        TRACE("  TVN_ITEMEXPANDING sent...\n");
 
         TREEVIEW_SendTreeviewNotify (
           hwnd, 
@@ -2488,7 +2488,7 @@
           0, 
           (HTREEITEM)expand);
 
-        TRACE(treeview, "  TVN_ITEMEXPANDED sent...\n");
+        TRACE("  TVN_ITEMEXPANDED sent...\n");
 
       }
       else
@@ -2499,14 +2499,14 @@
       break;
 
     case TVE_EXPANDPARTIAL:
-      TRACE(treeview, "  case TVE_EXPANDPARTIAL\n");
-      FIXME (treeview, "TVE_EXPANDPARTIAL not implemented\n");
+      TRACE("  case TVE_EXPANDPARTIAL\n");
+      FIXME("TVE_EXPANDPARTIAL not implemented\n");
       wineItem->state ^=TVIS_EXPANDED;
       wineItem->state |=TVIS_EXPANDEDONCE;
       break;
   }
 
-  TRACE(treeview, "Exiting, Item %d state is now %d...\n", 
+  TRACE("Exiting, Item %d state is now %d...\n", 
     expand, 
     wineItem->state);
   
@@ -2627,11 +2627,11 @@
 
     if (iLength == 0) 
     {
-      ERR( treeview, "Problem retreiving new item label.");
+      ERR("Problem retreiving new item label.");
     }
     else if (iLength >= 1023)
     {
-      ERR( treeview, 
+      ERR(
         "Insuficient space to retrieve new item label, new label ignored.");
     }
     else
@@ -2644,7 +2644,7 @@
         LPSTR tmpLabel = COMCTL32_Alloc( iLength+1 );
   
         if ( tmpLabel == NULL )
-          ERR( treeview, 
+          ERR(
             "OutOfMemory, cannot allocate space for label");
         else
         {
@@ -2672,14 +2672,14 @@
   TREEVIEW_ITEM *wineItem;
   POINT pt;
 
-  TRACE (treeview,"\n");
+  TRACE("\n");
   pt.x = (INT)LOWORD(lParam);
   pt.y = (INT)HIWORD(lParam);
   SetFocus (hwnd);
 
   wineItem=TREEVIEW_HitTestPoint (hwnd, pt);
   if (!wineItem) return 0;
-  TRACE (treeview,"item %d \n",(INT)wineItem->hItem);
+  TRACE("item %d \n",(INT)wineItem->hItem);
  
   if (TREEVIEW_SendSimpleNotify (hwnd, NM_DBLCLK)!=TRUE) {     /* FIXME!*/
   	TREEVIEW_Expand (hwnd, (WPARAM) TVE_TOGGLE, (LPARAM) wineItem->hItem);
@@ -2700,7 +2700,7 @@
 
   SetFocus (hwnd);
   iItem=TREEVIEW_HitTest (hwnd, (LPARAM) &ht);
-  TRACE (treeview,"item %d \n",iItem);
+  TRACE("item %d \n",iItem);
 
   if (ht.flags & TVHT_ONITEMBUTTON) {
     TREEVIEW_Expand (hwnd, (WPARAM) TVE_TOGGLE, (LPARAM) iItem);
@@ -2724,7 +2724,7 @@
   ht.pt.x = (INT)LOWORD(lParam);
   ht.pt.y = (INT)HIWORD(lParam);
  
-  TRACE (treeview,"\n");
+  TRACE("\n");
 
   /* Return true to cancel default behaviour */
   if ( TREEVIEW_SendSimpleNotify (hwnd, NM_CLICK) )
@@ -2758,7 +2758,7 @@
         return 0; 
       }
   
-  		TRACE(treeview,"Edit started for %s.\n", editItem->pszText);
+  		TRACE("Edit started for %s.\n", editItem->pszText);
   		infoPtr->editItem = editItem->hItem;
   
   		SetWindowPos ( 
@@ -2798,7 +2798,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview,"\n");
+ TRACE("\n");
  infoPtr->uInternalStatus|=TV_RDRAG;
  return 0;
 }
@@ -2808,7 +2808,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview,"\n");
+ TRACE("\n");
  if (TREEVIEW_SendSimpleNotify (hwnd, NM_RCLICK)) return 0;
  infoPtr->uInternalStatus&= ~(TV_RDRAG | TV_RDRAGGING);
  return 0;
@@ -2864,7 +2864,7 @@
  HFONT hOldFont;
  char    *itemtxt;
  
- TRACE (treeview,"\n");
+ TRACE("\n");
  if (!(infoPtr->himlNormal))  return 0;
  dragItem=TREEVIEW_ValidItem (infoPtr, (HTREEITEM) lParam);
  
@@ -2877,7 +2877,7 @@
  
  hOldFont=SelectObject (hdc, infoPtr->hFont);
  GetTextExtentPoint32A (hdc, itemtxt, lstrlenA (itemtxt), &size);
- TRACE (treeview,"%d %d %s %d\n",size.cx,size.cy,itemtxt,lstrlenA(itemtxt));
+ TRACE("%d %d %s %d\n",size.cx,size.cy,itemtxt,lstrlenA(itemtxt));
  hbmp=CreateCompatibleBitmap (htopdc, size.cx, size.cy);
  hOldbmp=SelectObject (hdc, hbmp);
 
@@ -2920,7 +2920,7 @@
 
   wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)newSelect);
 
-  TRACE (treeview,"Entering item %d, flag %x, cause %x, state %d\n", 
+  TRACE("Entering item %d, flag %x, cause %x, state %d\n", 
     (INT)newSelect, 
     action, 
     cause,
@@ -2986,13 +2986,13 @@
       break;
 
     case TVGN_FIRSTVISIBLE:
-      FIXME (treeview, "FIRSTVISIBLE not implemented\n");
+      FIXME("FIRSTVISIBLE not implemented\n");
       break;
  }
  
  TREEVIEW_QueueRefresh (hwnd);
 
-  TRACE (treeview,"Leaving state %d\n", wineItem->state);
+  TRACE("Leaving state %d\n", wineItem->state);
  return TRUE;
 }
 
@@ -3013,7 +3013,7 @@
 {
  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
 
- TRACE (treeview,"%x\n",infoPtr->hFont);
+ TRACE("%x\n",infoPtr->hFont);
  return infoPtr->hFont;
 }
 
@@ -3028,7 +3028,7 @@
  INT height;
  HDC hdc;
 
- TRACE (treeview,"%x %lx\n",wParam, lParam);
+ TRACE("%x %lx\n",wParam, lParam);
  
  infoPtr->hFont = (HFONT)wParam;
 
@@ -3062,7 +3062,7 @@
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
   int maxHeight;
 
-  TRACE (treeview,"wp %x, lp %lx\n", wParam, lParam);
+  TRACE("wp %x, lp %lx\n", wParam, lParam);
   if (!infoPtr->uInternalStatus & TV_VSCROLL) return FALSE;
 
   switch (LOWORD (wParam)) {
@@ -3106,7 +3106,7 @@
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
   int maxWidth;
 
-  TRACE (treeview,"wp %lx, lp %x\n", lParam, wParam);
+  TRACE("wp %lx, lp %x\n", lParam, wParam);
 	
   if (!infoPtr->uInternalStatus & TV_HSCROLL) return FALSE;
 
@@ -3162,7 +3162,7 @@
 
  TREEVIEW_ITEM *newItem        = NULL;
 
- TRACE (treeview,"%x %lx\n",wParam, lParam);
+ TRACE("%x %lx\n",wParam, lParam);
 
  if (prevSelect == 0) 
    return FALSE;
@@ -3289,7 +3289,7 @@
 	case VK_RETURN:
 
   default:
-		FIXME (treeview, "%x not implemented\n", wParam);
+		FIXME("%x not implemented\n", wParam);
 		break;
  }
 
@@ -3337,7 +3337,7 @@
           return TREEVIEW_InsertItemA (hwnd, wParam, lParam);
 
     	case TVM_INSERTITEMW:
-      		FIXME (treeview, "Unimplemented msg TVM_INSERTITEM32W\n");
+      		FIXME("Unimplemented msg TVM_INSERTITEM32W\n");
       		return 0;
 
     	case TVM_DELETEITEM:
@@ -3374,22 +3374,22 @@
       		return TREEVIEW_GetItemA (hwnd, wParam, lParam);
 
     	case TVM_GETITEMW:
-      		FIXME (treeview, "Unimplemented msg TVM_GETITEM32W\n");
+      		FIXME("Unimplemented msg TVM_GETITEM32W\n");
       		return 0;
 
     	case TVM_SETITEMA:
       		return TREEVIEW_SetItemA (hwnd, wParam, lParam);
 
     	case TVM_SETITEMW:
-      		FIXME (treeview, "Unimplemented msg TVM_SETITEMW\n");
+      		FIXME("Unimplemented msg TVM_SETITEMW\n");
       		return 0;
 
     	case TVM_EDITLABELA:
-      		FIXME (treeview, "Unimplemented msg TVM_EDITLABEL32A \n");
+      		FIXME("Unimplemented msg TVM_EDITLABEL32A \n");
       		return 0;
 
     	case TVM_EDITLABELW:
-      		FIXME (treeview, "Unimplemented msg TVM_EDITLABEL32W \n");
+      		FIXME("Unimplemented msg TVM_EDITLABEL32W \n");
       		return 0;
 
     	case TVM_GETEDITCONTROL:
@@ -3405,11 +3405,11 @@
       		return TREEVIEW_CreateDragImage (hwnd, wParam, lParam);
   
     	case TVM_SORTCHILDREN:
-      		FIXME (treeview, "Unimplemented msg TVM_SORTCHILDREN\n");
+      		FIXME("Unimplemented msg TVM_SORTCHILDREN\n");
       		return 0;
   
     	case TVM_ENSUREVISIBLE:
-      		FIXME (treeview, "Unimplemented msg TVM_ENSUREVISIBLE\n");
+      		FIXME("Unimplemented msg TVM_ENSUREVISIBLE\n");
       		return 0;
   
     	case TVM_SORTCHILDRENCB:
@@ -3419,11 +3419,11 @@
       		return TREEVIEW_EndEditLabelNow (hwnd, wParam, lParam);
   
     	case TVM_GETISEARCHSTRINGA:
-      		FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRING32A\n");
+      		FIXME("Unimplemented msg TVM_GETISEARCHSTRING32A\n");
       		return 0;
   
     	case TVM_GETISEARCHSTRINGW:
-      		FIXME (treeview, "Unimplemented msg TVM_GETISEARCHSTRING32W\n");
+      		FIXME("Unimplemented msg TVM_GETISEARCHSTRING32W\n");
       		return 0;
   
     	case TVM_GETTOOLTIPS:
@@ -3433,7 +3433,7 @@
       		return TREEVIEW_SetToolTips (hwnd, wParam);
   
     	case TVM_SETINSERTMARK:
-      		FIXME (treeview, "Unimplemented msg TVM_SETINSERTMARK\n");
+      		FIXME("Unimplemented msg TVM_SETINSERTMARK\n");
       		return 0;
   
     	case TVM_SETITEMHEIGHT:
@@ -3455,23 +3455,23 @@
       		return TREEVIEW_GetTextColor (hwnd);
   
     	case TVM_SETSCROLLTIME:
-      		FIXME (treeview, "Unimplemented msg TVM_SETSCROLLTIME\n");
+      		FIXME("Unimplemented msg TVM_SETSCROLLTIME\n");
       		return 0;
   
     	case TVM_GETSCROLLTIME:
-      		FIXME (treeview, "Unimplemented msg TVM_GETSCROLLTIME\n");
+      		FIXME("Unimplemented msg TVM_GETSCROLLTIME\n");
       		return 0;
   
     	case TVM_SETINSERTMARKCOLOR:
-      		FIXME (treeview, "Unimplemented msg TVM_SETINSERTMARKCOLOR\n");
+      		FIXME("Unimplemented msg TVM_SETINSERTMARKCOLOR\n");
       		return 0;
   
     	case TVM_SETUNICODEFORMAT:
-      		FIXME (treeview, "Unimplemented msg TVM_SETUNICODEFORMAT\n");
+      		FIXME("Unimplemented msg TVM_SETUNICODEFORMAT\n");
       		return 0;
   
     	case TVM_GETUNICODEFORMAT:
-      		FIXME (treeview, "Unimplemented msg TVM_GETUNICODEFORMAT\n");
+      		FIXME("Unimplemented msg TVM_GETUNICODEFORMAT\n");
       		return 0;
   
 		case WM_COMMAND: 
@@ -3553,7 +3553,7 @@
   
 		default:
 	    	if (uMsg >= WM_USER)
-		FIXME (treeview, "Unknown msg %04x wp=%08x lp=%08lx\n",
+		FIXME("Unknown msg %04x wp=%08x lp=%08lx\n",
   		     uMsg, wParam, lParam);
   	    return DefWindowProcA (hwnd, uMsg, wParam, lParam);
       }
@@ -3566,7 +3566,7 @@
 {
     WNDCLASSA wndClass;
 
-    TRACE (treeview,"\n");
+    TRACE("\n");
 
     if (GlobalFindAtomA (WC_TREEVIEWA)) return;
 
diff --git a/dlls/comctl32/updown.c b/dlls/comctl32/updown.c
index 8d8d567..a39e072 100644
--- a/dlls/comctl32/updown.c
+++ b/dlls/comctl32/updown.c
@@ -37,7 +37,7 @@
 #include "commctrl.h"
 #include "winnls.h"
 #include "updown.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(updown)
 
@@ -64,7 +64,7 @@
 
 static int accelIndex = -1;
 
-#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(updown, \
+#define UNKNOWN_PARAM(msg, wParam, lParam) WARN(\
         "UpDown Ctrl: Unknown parameter(s) for message " #msg     \
 	"(%04x): wp=%04x lp=%08lx\n", msg, wParam, lParam);
 
@@ -215,7 +215,7 @@
     if(*src || !UPDOWN_InBounds (hwnd, newVal)) 
       return FALSE;
 
-    TRACE(updown, "new value(%d) read from buddy (old=%d)\n", 
+    TRACE("new value(%d) read from buddy (old=%d)\n", 
 		 newVal, infoPtr->CurVal);
   }
   
@@ -240,7 +240,7 @@
   if (!IsWindow(infoPtr->Buddy)) 
     return FALSE;
 
-  TRACE(updown, "set new value(%d) to buddy.\n",
+  TRACE("set new value(%d) to buddy.\n",
 	       infoPtr->CurVal);
 
   /*if the buddy is a list window, we must set curr index */
@@ -366,7 +366,7 @@
   GetClassNameA (hwndBud, infoPtr->szBuddyClass, 40);
 
   if(dwStyle & UDS_ARROWKEYS){
-    FIXME(updown, "we need to subclass the buddy to process the arrow keys.\n");
+    FIXME("we need to subclass the buddy to process the arrow keys.\n");
   }
 
   /* do we need to do any adjustments? */
@@ -422,7 +422,7 @@
   int old_val = infoPtr->CurVal;
   NM_UPDOWN ni;
 
-  TRACE(updown, "%s by %d\n", incr ? "inc" : "dec", delta);
+  TRACE("%s by %d\n", incr ? "inc" : "dec", delta);
 
   /* check if we can do the modification first */
   delta *= (incr ? 1 : -1) * (infoPtr->MaxVal < infoPtr->MinVal ? -1 : 1);
@@ -592,7 +592,7 @@
       break;
 
       default:
-	ERR(updown, "Impossible case!\n");
+	ERR("Impossible case!\n");
     }
 
 }
@@ -629,7 +629,7 @@
       if (dwStyle & UDS_AUTOBUDDY)
 	UPDOWN_SetBuddy (hwnd, GetWindow (hwnd, GW_HWNDPREV));
 	
-      TRACE(updown, "UpDown Ctrl creation, hwnd=%04x\n", hwnd);
+      TRACE("UpDown Ctrl creation, hwnd=%04x\n", hwnd);
       break;
     
     case WM_DESTROY:
@@ -638,7 +638,7 @@
 
       COMCTL32_Free (infoPtr);
 
-      TRACE(updown, "UpDown Ctrl destruction, hwnd=%04x\n", hwnd);
+      TRACE("UpDown Ctrl destruction, hwnd=%04x\n", hwnd);
       break;
 	
     case WM_ENABLE:
@@ -728,7 +728,7 @@
       return temp;
 
     case UDM_SETACCEL:
-      TRACE(updown, "UpDown Ctrl new accel info, hwnd=%04x\n", hwnd);
+      TRACE("UpDown Ctrl new accel info, hwnd=%04x\n", hwnd);
       if(infoPtr->AccelVect){
 	COMCTL32_Free (infoPtr->AccelVect);
 	infoPtr->AccelCount = 0;
@@ -748,7 +748,7 @@
       return infoPtr->Base;
 
     case UDM_SETBASE:
-      TRACE(updown, "UpDown Ctrl new base(%d), hwnd=%04x\n", 
+      TRACE("UpDown Ctrl new base(%d), hwnd=%04x\n", 
 		     wParam, hwnd);
       if ( !(wParam==10 || wParam==16) || lParam)
 	UNKNOWN_PARAM(UDM_SETBASE, wParam, lParam);
@@ -770,7 +770,7 @@
       temp = infoPtr->Buddy;
       infoPtr->Buddy = wParam;
       UPDOWN_SetBuddy (hwnd, wParam);
-      TRACE(updown, "UpDown Ctrl new buddy(%04x), hwnd=%04x\n", 
+      TRACE("UpDown Ctrl new buddy(%04x), hwnd=%04x\n", 
 		     infoPtr->Buddy, hwnd);
       return temp;
 
@@ -784,7 +784,7 @@
       if (wParam || HIWORD(lParam))
 	UNKNOWN_PARAM(UDM_GETPOS, wParam, lParam);
       temp = SLOWORD(lParam);
-      TRACE(updown, "UpDown Ctrl new value(%d), hwnd=%04x\n",
+      TRACE("UpDown Ctrl new value(%d), hwnd=%04x\n",
 		     temp, hwnd);
       if(!UPDOWN_InBounds(hwnd, temp)){
 	if(temp < infoPtr->MinVal)  
@@ -809,7 +809,7 @@
       infoPtr->MaxVal = SLOWORD(lParam); /* UD_MINVAL <= Max <= UD_MAXVAL */
       infoPtr->MinVal = SHIWORD(lParam); /* UD_MINVAL <= Min <= UD_MAXVAL */
                                          /* |Max-Min| <= UD_MAXVAL        */
-      TRACE(updown, "UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
+      TRACE("UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
 		     infoPtr->MinVal, infoPtr->MaxVal, hwnd);
       break;                             
 
@@ -825,13 +825,13 @@
       infoPtr->MaxVal = (INT)lParam;
       if (infoPtr->MaxVal <= infoPtr->MinVal)
 	infoPtr->MaxVal = infoPtr->MinVal + 1;
-      TRACE(updown, "UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
+      TRACE("UpDown Ctrl new range(%d to %d), hwnd=%04x\n", 
 		     infoPtr->MinVal, infoPtr->MaxVal, hwnd);
       break;
 
     default: 
       if (message >= WM_USER) 
-	ERR (updown, "unknown msg %04x wp=%04x lp=%08lx\n", 
+	ERR("unknown msg %04x wp=%04x lp=%08lx\n", 
 	     message, wParam, lParam);
       return DefWindowProcA (hwnd, message, wParam, lParam); 
     } 
diff --git a/dlls/commdlg/cdlg32.c b/dlls/commdlg/cdlg32.c
index 6a9c26d..9911c36 100644
--- a/dlls/commdlg/cdlg32.c
+++ b/dlls/commdlg/cdlg32.c
@@ -8,7 +8,7 @@
 #include "winbase.h"
 #include "commdlg.h"
 #include "cderr.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(commdlg)
 
@@ -32,7 +32,7 @@
  */
 BOOL WINAPI COMDLG32_DllEntryPoint(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
 {
-	TRACE(commdlg, "(%08x, %08lx, %p)\n", hInstance, Reason, Reserved);
+	TRACE("(%08x, %08lx, %p)\n", hInstance, Reason, Reserved);
 
 	switch(Reason)
 	{
@@ -40,7 +40,7 @@
 		COMDLG32_Attach++;
 		if(COMDLG32_hInstance)
 		{
-			ERR(commdlg, "comdlg32.dll instantiated twice in one address space!\n");
+			ERR("comdlg32.dll instantiated twice in one address space!\n");
 			/*
 			 * We should return FALSE here, but that will break
 			 * most apps that use CreateProcess because we do
@@ -56,14 +56,14 @@
 		{
 			if(!(COMDLG32_hInstance16 = LoadLibrary16("commdlg.dll")))
 			{
-				ERR(commdlg, "Could not load sibling commdlg.dll\n");
+				ERR("Could not load sibling commdlg.dll\n");
 				return FALSE;
 			}
 		}
 
 		if((COMDLG32_TlsIndex = TlsAlloc()) == 0xffffffff)
 		{
-			ERR(commdlg, "No space for COMDLG32 TLS\n");
+			ERR("No space for COMDLG32 TLS\n");
 			return FALSE;
 		}
 		break;
@@ -109,7 +109,7 @@
  */
 void COMDLG32_SetCommDlgExtendedError(DWORD err)
 {
-	TRACE(commdlg, "(%08lx)\n", err);
+	TRACE("(%08lx)\n", err);
 	TlsSetValue(COMDLG32_TlsIndex, (void *)err);
 }
 
diff --git a/dlls/commdlg/colordlg.c b/dlls/commdlg/colordlg.c
index f050d47..6e374a4 100644
--- a/dlls/commdlg/colordlg.c
+++ b/dlls/commdlg/colordlg.c
@@ -18,7 +18,7 @@
 #include "dialog.h"
 #include "dlgs.h"
 #include "module.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winproc.h"
 #include "cderr.h"
 
@@ -37,7 +37,7 @@
     LPCVOID template;
     HWND hwndDialog;
 
-    TRACE(commdlg,"ChooseColor\n");
+    TRACE("ChooseColor\n");
     if (!lpChCol) return FALSE;    
 
     if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE)
@@ -594,7 +594,7 @@
   if (lpp->hdcMem)
       BitBlt(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
   else
-    WARN(commdlg,"choose color: hdcMem is not defined\n");
+    WARN("choose color: hdcMem is not defined\n");
   ReleaseDC(hwnd,hDC);
  }
 }
@@ -815,7 +815,7 @@
    POINT16 point;
    struct CCPRIVATE * lpp; 
    
-   TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+   TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
    lpp=calloc(1,sizeof(struct CCPRIVATE));
    lpp->lpcc=(LPCHOOSECOLOR16)lParam;
 
@@ -910,7 +910,7 @@
     HDC hdc;
     COLORREF *cr;
     struct CCPRIVATE * lpp=(struct CCPRIVATE *)GetWindowLongA(hDlg, DWL_USER); 
-    TRACE(commdlg,"CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
+    TRACE("CC_WMCommand wParam=%x lParam=%lx\n",wParam,lParam);
     switch (wParam)
     {
           case 0x2c2:  /* edit notify RGB */
diff --git a/dlls/commdlg/filedlg.c b/dlls/commdlg/filedlg.c
index 9a67484..2a78e2d 100644
--- a/dlls/commdlg/filedlg.c
+++ b/dlls/commdlg/filedlg.c
@@ -19,7 +19,7 @@
 #include "dlgs.h"
 #include "module.h"
 #include "drive.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winproc.h"
 #include "cderr.h"
 
@@ -56,13 +56,13 @@
 	if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 || 
 	    hHDisk == 0 || hCDRom == 0 || hNet == 0)
 	{
-	    ERR(commdlg, "Error loading icons !\n");
+	    ERR("Error loading icons !\n");
 	    return FALSE;
 	}
 	fldrInfo = (CURSORICONINFO *) GlobalLock16( hFolder2 );
 	if (!fldrInfo)
 	{	
-	    ERR(commdlg, "Error measuring icons !\n");
+	    ERR("Error measuring icons !\n");
 	    return FALSE;
 	}
 	fldrHeight = fldrInfo -> nHeight;
@@ -183,7 +183,7 @@
     if (!(lpofn->lpstrFilter))
       {
        str = SEGPTR_ALLOC(sizeof(defaultfilter));
-       TRACE(commdlg,"Alloc %p default for Filetype in GetOpenFileName\n",str);
+       TRACE("Alloc %p default for Filetype in GetOpenFileName\n",str);
        memcpy(str,defaultfilter,sizeof(defaultfilter));
        lpofn->lpstrFilter=SEGPTR_GET(str);
       }
@@ -191,7 +191,7 @@
     if (!(lpofn->lpstrTitle))
       {
        str1 = SEGPTR_ALLOC(strlen(defaultopen)+1);
-       TRACE(commdlg,"Alloc %p default for Title in GetOpenFileName\n",str1);
+       TRACE("Alloc %p default for Title in GetOpenFileName\n",str1);
        strcpy(str1,defaultopen);
        lpofn->lpstrTitle=SEGPTR_GET(str1);
       }
@@ -205,14 +205,14 @@
 
     if (str1)
       {
-       TRACE(commdlg,"Freeing %p default for Title in GetOpenFileName\n",str1);
+       TRACE("Freeing %p default for Title in GetOpenFileName\n",str1);
         SEGPTR_FREE(str1);
        lpofn->lpstrTitle=0;
       }
 
     if (str)
       {
-       TRACE(commdlg,"Freeing %p default for Filetype in GetOpenFileName\n",str);
+       TRACE("Freeing %p default for Filetype in GetOpenFileName\n",str);
         SEGPTR_FREE(str);
        lpofn->lpstrFilter=0;
       }
@@ -224,7 +224,7 @@
 		    FreeResource16( hDlgTmpl );
     }
 
-    TRACE(commdlg,"return lpstrFile='%s' !\n", 
+    TRACE("return lpstrFile='%s' !\n", 
            (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
     return bRet;
 }
@@ -346,7 +346,7 @@
     if (!(lpofn->lpstrFilter))
       {
        str = SEGPTR_ALLOC(sizeof(defaultfilter));
-       TRACE(commdlg,"Alloc default for Filetype in GetSaveFileName\n");
+       TRACE("Alloc default for Filetype in GetSaveFileName\n");
        memcpy(str,defaultfilter,sizeof(defaultfilter));
        lpofn->lpstrFilter=SEGPTR_GET(str);
       }
@@ -354,7 +354,7 @@
     if (!(lpofn->lpstrTitle))
       {
        str1 = SEGPTR_ALLOC(sizeof(defaultsave)+1);
-       TRACE(commdlg,"Alloc default for Title in GetSaveFileName\n");
+       TRACE("Alloc default for Title in GetSaveFileName\n");
        strcpy(str1,defaultsave);
        lpofn->lpstrTitle=SEGPTR_GET(str1);
       }
@@ -367,14 +367,14 @@
 
     if (str1)
       {
-       TRACE(commdlg,"Freeing %p default for Title in GetSaveFileName\n",str1);
+       TRACE("Freeing %p default for Title in GetSaveFileName\n",str1);
         SEGPTR_FREE(str1);
        lpofn->lpstrTitle=0;
       }
  
     if (str)
       {
-       TRACE(commdlg,"Freeing %p default for Filetype in GetSaveFileName\n",str);
+       TRACE("Freeing %p default for Filetype in GetSaveFileName\n",str);
         SEGPTR_FREE(str);
        lpofn->lpstrFilter=0;
       }
@@ -386,7 +386,7 @@
 		    FreeResource16( hDlgTmpl );
     }
 
-    TRACE(commdlg, "return lpstrFile='%s' !\n", 
+    TRACE("return lpstrFile='%s' !\n", 
             (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
     return bRet;
 }
@@ -441,12 +441,12 @@
 		 char*	scptr; /* ptr on semi-colon */
 		 char*	filter = buffer;
 
-		 TRACE(commdlg, "Using filter %s\n", filter);
+		 TRACE("Using filter %s\n", filter);
 		 SendMessageA(hlb, LB_RESETCONTENT, 0, 0);
 		 while (filter) {
 			 scptr = strchr(filter, ';');
 			 if (scptr)	*scptr = 0;
-			 TRACE(commdlg, "Using file spec %s\n", filter);
+			 TRACE("Using file spec %s\n", filter);
 			 if (SendMessageA(hlb, LB_DIR, 0, (LPARAM)filter) == LB_ERR)
 				 return FALSE;
 			 if (scptr) *scptr = ';';
@@ -700,7 +700,7 @@
     {
       pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter);
       n = 0;
-      TRACE(commdlg,"lpstrCustomFilter = %p\n", pstr);
+      TRACE("lpstrCustomFilter = %p\n", pstr);
       while(*pstr)
 	{
 	  old_pstr = pstr;
@@ -708,7 +708,7 @@
                                    (LPARAM)lpofn->lpstrCustomFilter + n );
           n += strlen(pstr) + 1;
 	  pstr += strlen(pstr) + 1;
-	  TRACE(commdlg,"add str='%s' "
+	  TRACE("add str='%s' "
 			  "associated to '%s'\n", old_pstr, pstr);
           SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
           n += strlen(pstr) + 1;
@@ -725,7 +725,7 @@
 				       (LPARAM)lpofn->lpstrFilter + n );
 	  n += strlen(pstr) + 1;
 	  pstr += strlen(pstr) + 1;
-	  TRACE(commdlg,"add str='%s' "
+	  TRACE("add str='%s' "
 			  "associated to '%s'\n", old_pstr, pstr);
 	  SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA16, i, (LPARAM)pstr);
 	  n += strlen(pstr) + 1;
@@ -739,7 +739,7 @@
   strncpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
 	     PTR_SEG_TO_LIN(lpofn->lpstrFilter), lpofn->nFilterIndex - 1),511);
   tmpstr[511]=0;
-  TRACE(commdlg,"nFilterIndex = %ld, SetText of edt1 to '%s'\n", 
+  TRACE("nFilterIndex = %ld, SetText of edt1 to '%s'\n", 
   			lpofn->nFilterIndex, tmpstr);
   SetDlgItemTextA( hWnd, edt1, tmpstr );
   /* get drive list */
@@ -759,7 +759,7 @@
   if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
     *tmpstr = 0;
     if (!FILEDLG_ScanDir(hWnd, tmpstr))
-      WARN(commdlg, "Couldn't read initial directory %s!\n",tmpstr);
+      WARN("Couldn't read initial directory %s!\n",tmpstr);
   }
   /* select current drive in combo 2, omit missing drives */
   for(i=0, n=-1; i<=DRIVE_GetCurrentDrive(); i++)
@@ -860,7 +860,7 @@
       if (lRet == LB_ERR)
 	return TRUE;
       pstr = (LPSTR)SendDlgItemMessage16(hWnd, cmb1, CB_GETITEMDATA16, lRet, 0);
-      TRACE(commdlg,"Selected filter : %s\n", pstr);
+      TRACE("Selected filter : %s\n", pstr);
       SetDlgItemTextA( hWnd, edt1, pstr );
       FILEDLG_ScanDir(hWnd, tmpstr);
       in_update=TRUE;
@@ -884,7 +884,7 @@
 	      strcpy(tmpstr2, tmpstr);
 	      *tmpstr=0;
 	    }
-	  TRACE(commdlg,"tmpstr=%s, tmpstr2=%s\n", tmpstr, tmpstr2);
+	  TRACE("tmpstr=%s, tmpstr2=%s\n", tmpstr, tmpstr2);
           SetDlgItemTextA( hWnd, edt1, tmpstr2 );
 	  FILEDLG_ScanDir(hWnd, tmpstr);
 	  return TRUE;
@@ -897,7 +897,7 @@
       lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL16, 0, 0);
       if (lRet == LB_ERR) return TRUE;
       lpofn->nFilterIndex = lRet + 1;
-      TRACE(commdlg,"lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
+      TRACE("lpofn->nFilterIndex=%ld\n", lpofn->nFilterIndex);
       lstrcpynA(tmpstr2, 
 	     FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
 				 PTR_SEG_TO_LIN(lpofn->lpstrFilter),
diff --git a/dlls/commdlg/filetitle.c b/dlls/commdlg/filetitle.c
index 1838319..98ca2d0 100644
--- a/dlls/commdlg/filetitle.c
+++ b/dlls/commdlg/filetitle.c
@@ -10,7 +10,7 @@
 #include "wine/winestring.h"
 #include "winbase.h"
 #include "commdlg.h"
-#include "debug.h"
+#include "debugtools.h"
 
 #include "heap.h"	/* Has to go */
 
@@ -26,7 +26,7 @@
 {
 	int i, len;
 
-	TRACE(commdlg,"(%p %p %d); \n", lpFile, lpTitle, cbBuf);
+	TRACE("(%p %p %d); \n", lpFile, lpTitle, cbBuf);
 
 	if(lpFile == NULL || lpTitle == NULL)
 		return -1;
@@ -56,7 +56,7 @@
 	if(i == -1)
 		i++;
 
-	TRACE(commdlg,"---> '%s' \n", &lpFile[i]);
+	TRACE("---> '%s' \n", &lpFile[i]);
     
 	len = strlen(lpFile+i)+1;
 	if(cbBuf < len)
diff --git a/dlls/commdlg/finddlg.c b/dlls/commdlg/finddlg.c
index 0e593b9..4740027 100644
--- a/dlls/commdlg/finddlg.c
+++ b/dlls/commdlg/finddlg.c
@@ -16,7 +16,7 @@
 #include "dialog.h"
 #include "dlgs.h"
 #include "module.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winproc.h"
 #include "cderr.h"
 
@@ -39,7 +39,7 @@
      * For now, only the standard dialog works.
      */
     if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | 
-	FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");     
+	FR_ENABLEHOOK)) FIXME(": unimplemented flag (ignored)\n");     
     if (!(hResInfo = FindResourceA(COMMDLG_hInstance32, MAKEINTRESOURCEA(FINDDLGORD), RT_DIALOGA)))
     {
 	COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
@@ -73,7 +73,7 @@
      * and make CommDlgExtendedError() return the error condition.
      */
     if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE | 
-	FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");     
+	FR_ENABLEHOOK)) FIXME(": unimplemented flag (ignored)\n");     
     if (!(hResInfo = FindResourceA(COMMDLG_hInstance32, MAKEINTRESOURCEA(REPLACEDLGORD), RT_DIALOGA)))
     {
 	COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
diff --git a/dlls/commdlg/finddlg32.c b/dlls/commdlg/finddlg32.c
index f998fa4..d29ee1a 100644
--- a/dlls/commdlg/finddlg32.c
+++ b/dlls/commdlg/finddlg32.c
@@ -10,7 +10,7 @@
 #include "commdlg.h"
 #include "cderr.h"
 #include "dlgs.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(commdlg)
 
@@ -158,7 +158,7 @@
                 pdata = (COMDLG32_FR_Data *)lParam;
         	if(!SetPropA(hDlgWnd, (LPSTR)COMDLG32_Atom, (HANDLE)pdata))
                 {
-			ERR(commdlg, "Could not Set prop; invent a gracefull exit?...\n");
+			ERR("Could not Set prop; invent a gracefull exit?...\n");
                 	DestroyWindow(hDlgWnd);
                         return FALSE;
                 }
@@ -237,12 +237,12 @@
 
 	        case WM_HELP:
         		/* Heeeeelp! */
-        		FIXME(commdlg, "Got WM_HELP. Who is gonna supply it?\n");
+        		FIXME("Got WM_HELP. Who is gonna supply it?\n");
 	                break;
 
         	case WM_CONTEXTMENU:
         		/* Heeeeelp! */
-        		FIXME(commdlg, "Got WM_CONTEXTMENU. Who is gonna supply it?\n");
+        		FIXME("Got WM_CONTEXTMENU. Who is gonna supply it?\n");
         	        break;
 		/* FIXME: Handle F1 help */
 
@@ -348,7 +348,7 @@
         DWORD error;
         LPDLGTEMPLATEW rcs;
 
-	TRACE(commdlg, "hInst=%08x, Flags=%08lx\n", pdata->fr.hInstance, pdata->fr.Flags);
+	TRACE("hInst=%08x, Flags=%08lx\n", pdata->fr.hInstance, pdata->fr.Flags);
 
         if(!(pdata->fr.Flags & FR_ENABLETEMPLATEHANDLE))
         {
@@ -423,7 +423,7 @@
 ) {
 	COMDLG32_FR_Data *pdata;
 
-        TRACE(commdlg, "LPFINDREPLACE=%p\n", pfr);
+        TRACE("LPFINDREPLACE=%p\n", pfr);
 
 	if(!COMDLG32_FR_CheckPartial(pfr, FALSE))
         	return 0;
@@ -447,7 +447,7 @@
 ) {
 	COMDLG32_FR_Data *pdata;
 
-        TRACE(commdlg, "LPFINDREPLACE=%p\n", pfr);
+        TRACE("LPFINDREPLACE=%p\n", pfr);
 
 	if(!COMDLG32_FR_CheckPartial(pfr, TRUE))
         	return 0;
@@ -472,7 +472,7 @@
 ) {
 	COMDLG32_FR_Data *pdata;
 
-        TRACE(commdlg, "LPFINDREPLACE=%p\n", pfr);
+        TRACE("LPFINDREPLACE=%p\n", pfr);
 
 	if(!COMDLG32_FR_CheckPartial((LPFINDREPLACEA)pfr, FALSE))
         	return 0;
@@ -500,7 +500,7 @@
 ) {
 	COMDLG32_FR_Data *pdata;
 
-        TRACE(commdlg, "LPFINDREPLACE=%p\n", pfr);
+        TRACE("LPFINDREPLACE=%p\n", pfr);
 
 	if(!COMDLG32_FR_CheckPartial((LPFINDREPLACEA)pfr, FALSE))
         	return 0;
diff --git a/dlls/commdlg/fontdlg.c b/dlls/commdlg/fontdlg.c
index 5107219..75937cf 100644
--- a/dlls/commdlg/fontdlg.c
+++ b/dlls/commdlg/fontdlg.c
@@ -18,7 +18,7 @@
 #include "dialog.h"
 #include "dlgs.h"
 #include "module.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "font.h"
 #include "winproc.h"
 #include "cderr.h"
@@ -69,7 +69,7 @@
     cf32a.lpLogFont=&lf32a;
     CFn_CHOOSEFONT16to32A(lpChFont, &cf32a);
 
-    TRACE(commdlg,"ChooseFont\n");
+    TRACE("ChooseFont\n");
     if (!lpChFont) return FALSE;    
 
     if (lpChFont->Flags & CF_ENABLETEMPLATEHANDLE)
@@ -157,7 +157,7 @@
   }
 
   if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
-    CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+    CF_ENABLETEMPLATEHANDLE)) FIXME(": unimplemented flag (ignored)\n");
   hwndDialog = DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
             (DLGPROC16)FormatCharDlgProcA, (LPARAM)lpChFont, WIN_PROC_32A );
   if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);  
@@ -190,7 +190,7 @@
   }
 
   if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
-    CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+    CF_ENABLETEMPLATEHANDLE)) FIXME(": unimplemented flag (ignored)\n");
   memcpy(&cf32a, lpChFont, sizeof(cf32a));
   memcpy(&lf32a, lpChFont->lpLogFont, sizeof(LOGFONTA));
   lstrcpynWtoA(lf32a.lfFaceName, lpChFont->lpLogFont->lfFaceName, LF_FACESIZE);
@@ -253,7 +253,7 @@
   int i;
   WORD w;
 
-  TRACE(commdlg,"font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType);
+  TRACE("font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType);
 
   if (lpcf->Flags & CF_FIXEDPITCHONLY)
    if (!(lplf->lfPitchAndFamily & FIXED_PITCH))
@@ -398,8 +398,8 @@
 {
   int i;
   
-  TRACE(commdlg,"(nFontType=%d)\n",nFontType);
-  TRACE(commdlg,"  %s h=%ld w=%ld e=%ld o=%ld wg=%ld i=%d u=%d s=%d"
+  TRACE("(nFontType=%d)\n",nFontType);
+  TRACE("  %s h=%ld w=%ld e=%ld o=%ld wg=%ld i=%d u=%d s=%d"
 	       " ch=%d op=%d cp=%d q=%d pf=%xh\n",
 	       lplf->lfFaceName,lplf->lfHeight,lplf->lfWidth,
 	       lplf->lfEscapement,lplf->lfOrientation,
@@ -469,11 +469,11 @@
 
   SetWindowLongA(hDlg, DWL_USER, lParam); 
   lpxx=lpcf->lpLogFont;
-  TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+  TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
 
   if (lpcf->lStructSize != sizeof(CHOOSEFONTA))
   {
-    ERR(commdlg,"structure size failure !!!\n");
+    ERR("structure size failure !!!\n");
     EndDialog (hDlg, 0); 
     return FALSE;
   }
@@ -517,7 +517,7 @@
     s.hWnd1=GetDlgItem(hDlg,cmb1);
     s.lpcf32a=lpcf;
     if (!EnumFontFamiliesA(hdc, NULL, FontFamilyEnumProc, (LPARAM)&s))
-      TRACE(commdlg,"EnumFontFamilies returns 0\n");
+      TRACE("EnumFontFamilies returns 0\n");
     if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
     {
       /* look for fitting font name in combobox1 */
@@ -564,7 +564,7 @@
   }
   else
   {
-    WARN(commdlg,"HDC failure !!!\n");
+    WARN("HDC failure !!!\n");
     EndDialog (hDlg, 0); 
     return FALSE;
   }
@@ -721,7 +721,7 @@
   HDC hdc;
   LPLOGFONTA lpxx=lpcf->lpLogFont;
   
-  TRACE(commdlg,"WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG)wParam, lParam);
+  TRACE("WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG)wParam, lParam);
   switch (LOWORD(wParam))
   {
 	case cmb1:if (HIWORD(wParam)==CBN_SELCHANGE)
@@ -739,7 +739,7 @@
                         char str[256];
                         SendDlgItemMessageA(hDlg, cmb1, CB_GETLBTEXT, i,
                                               (LPARAM)str);
-	                TRACE(commdlg,"WM_COMMAND/cmb1 =>%s\n",str);
+	                TRACE("WM_COMMAND/cmb1 =>%s\n",str);
 			s.hWnd1=GetDlgItem(hDlg, cmb2);
 			s.hWnd2=GetDlgItem(hDlg, cmb3);
 			s.lpcf32a=lpcf;
@@ -751,7 +751,7 @@
  		    }
  		    else
                     {
-                      WARN(commdlg,"HDC failure !!!\n");
+                      WARN("HDC failure !!!\n");
                       EndDialog (hDlg, 0); 
                       return TRUE;
                     }
@@ -762,7 +762,7 @@
 	case cmb3:if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED )
 	          {
                     char str[256];
-                    TRACE(commdlg,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
+                    TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam);
 		    i=SendDlgItemMessageA(hDlg,cmb1,CB_GETCURSEL,0,0);
 		    if (i==CB_ERR)
                       i=GetDlgItemTextA( hDlg, cmb1, str, 256 );
@@ -884,7 +884,7 @@
     lpcf32a=(LPCHOOSEFONTA)lpcf->lpTemplateName;
     if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a)) 
     {
-      TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+      TRACE("CFn_WMInitDialog returned FALSE\n");
       return FALSE;
     }  
     if (CFn_HookCallChk(lpcf))
@@ -910,9 +910,9 @@
                         res=CFn_WMDestroy(hDlg, wParam32, lParam);
 			break;
       case WM_CHOOSEFONT_GETLOGFONT: 
-                         TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+                         TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
 				      lParam);
-			 FIXME(commdlg, "current logfont back to caller\n");
+			 FIXME("current logfont back to caller\n");
                         break;
     }
   WINPROC_UnmapMsg16To32A(hDlg,uMsg32, wParam32, lParam, res);    
@@ -942,7 +942,7 @@
     lpcf=(LPCHOOSEFONTA)lParam;
     if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf)) 
     {
-      TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+      TRACE("CFn_WMInitDialog returned FALSE\n");
       return FALSE;
     }  
     if (CFn_HookCallChk32(lpcf))
@@ -961,9 +961,9 @@
       case WM_DESTROY:
                         return CFn_WMDestroy(hDlg, wParam, lParam);
       case WM_CHOOSEFONT_GETLOGFONT:
-                         TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+                         TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
 				      lParam);
-			 FIXME(commdlg, "current logfont back to caller\n");
+			 FIXME("current logfont back to caller\n");
                         break;
     }
   return res;
@@ -994,7 +994,7 @@
     lpcf32a=(LPCHOOSEFONTA)lpcf32w->lpTemplateName;
     if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a)) 
     {
-      TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+      TRACE("CFn_WMInitDialog returned FALSE\n");
       return FALSE;
     }  
     if (CFn_HookCallChk32((LPCHOOSEFONTA)lpcf32w))
@@ -1014,9 +1014,9 @@
       case WM_DESTROY:
                         return CFn_WMDestroy(hDlg, wParam, lParam);
       case WM_CHOOSEFONT_GETLOGFONT: 
-                         TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+                         TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
 				      lParam);
-			 FIXME(commdlg, "current logfont back to caller\n");
+			 FIXME("current logfont back to caller\n");
                         break;
     }
   return res;
diff --git a/dlls/commdlg/generic.c b/dlls/commdlg/generic.c
index e71846f..f105d32 100644
--- a/dlls/commdlg/generic.c
+++ b/dlls/commdlg/generic.c
@@ -9,7 +9,7 @@
 
 #include "winbase.h"
 #include "commdlg.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(commdlg)
 
@@ -28,14 +28,14 @@
  */
 BOOL WINAPI COMMDLG_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst, WORD ds, WORD HeapSize, DWORD res1, WORD res2)
 {
-	TRACE(commdlg, "(%08lx, %04x, %04x, %04x, %08lx, %04x)\n", Reason, hInst, ds, HeapSize, res1, res2);
+	TRACE("(%08lx, %04x, %04x, %04x, %08lx, %04x)\n", Reason, hInst, ds, HeapSize, res1, res2);
 	switch(Reason)
 	{
 	case DLL_PROCESS_ATTACH:
 		COMMDLG_Attach++;
 		if(COMMDLG_hInstance)
 		{
-			ERR(commdlg, "commdlg.dll instantiated twice!\n");
+			ERR("commdlg.dll instantiated twice!\n");
 			/*
 			 * We should return FALSE here, but that will break
 			 * most apps that use CreateProcess because we do
@@ -49,7 +49,7 @@
 		{
 			if(!(COMMDLG_hInstance32 = LoadLibraryA("comdlg32.dll")))
 			{
-				ERR(commdlg, "Could not load sibling comdlg32.dll\n");
+				ERR("Could not load sibling comdlg32.dll\n");
 				return FALSE;
 			}
 		}
diff --git a/dlls/commdlg/printdlg.c b/dlls/commdlg/printdlg.c
index 5e371b5..cabc002 100644
--- a/dlls/commdlg/printdlg.c
+++ b/dlls/commdlg/printdlg.c
@@ -18,7 +18,7 @@
 #include "dialog.h"
 #include "dlgs.h"
 #include "module.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winproc.h"
 #include "cderr.h"
 #include "winspool.h"
@@ -40,7 +40,7 @@
     LPSTR rscname;
     LPPRINTDLG16 lpPrint = (LPPRINTDLG16)PTR_SEG_TO_LIN(printdlg);
 
-    TRACE(commdlg,"(%p) -- Flags=%08lX\n", lpPrint, lpPrint->Flags );
+    TRACE("(%p) -- Flags=%08lX\n", lpPrint, lpPrint->Flags );
 
     if (lpPrint->Flags & PD_RETURNDEFAULT)
         /* FIXME: should fill lpPrint->hDevMode and lpPrint->hDevNames here */
@@ -130,7 +130,7 @@
     DWORD     CopyOfEnumBytesNeeded;
     PRINT_PTRA PrintStructures;
 
-    FIXME(commdlg, "KVG (%p): stub\n", lppd);
+    FIXME("KVG (%p): stub\n", lppd);
     PrintStructures.lpPrintDlg = lppd;
 
     if (!(hResInfo = FindResourceA(COMDLG32_hInstance, "PRINT32", RT_DIALOGA)))
@@ -171,7 +171,7 @@
 	 */
 	if (lppd->Flags & PD_RETURNDEFAULT)
 	   {
-	    WARN(commdlg, ": PrintDlg was requested to return printer info only."
+	    WARN(": PrintDlg was requested to return printer info only."
 					  "\n The return value currently does NOT provide these.\n");
 		COMDLG32_SetCommDlgExtendedError(PDERR_NODEVICES); 
         								/* return TRUE, thus never checked! */
@@ -180,7 +180,7 @@
 	   
 	if (lppd->Flags & PD_PRINTSETUP)
 		{
-		 FIXME(commdlg, ": PrintDlg was requested to display PrintSetup box.\n");
+		 FIXME(": PrintDlg was requested to display PrintSetup box.\n");
 		 COMDLG32_SetCommDlgExtendedError(PDERR_INITFAILURE); 
 		 return(FALSE);
 		}
@@ -204,7 +204,7 @@
     /* FIXME: Currently Unimplemented */
     if (lppd->Flags & PD_NOWARNING)	
 	   {
-	    WARN(commdlg, ": PD_NOWARNING Flag is not yet implemented.\n");
+	    WARN(": PD_NOWARNING Flag is not yet implemented.\n");
 	   }
     	
     /*
@@ -214,7 +214,7 @@
     if (lppd->Flags & (PD_ENABLEPRINTHOOK | PD_ENABLEPRINTTEMPLATE |
 			  PD_ENABLEPRINTTEMPLATEHANDLE | PD_ENABLESETUPHOOK | 
 			  PD_ENABLESETUPTEMPLATE|PD_ENABLESETUPTEMPLATEHANDLE)) 
-    	FIXME(commdlg, ": unimplemented flag (ignored)\n");     
+    	FIXME(": unimplemented flag (ignored)\n");     
 	
 		
     hwndDialog= DIALOG_CreateIndirect(hInst, ptr, TRUE, lppd->hwndOwner,
@@ -234,7 +234,7 @@
  */
 BOOL WINAPI PrintDlgW( LPPRINTDLGW printdlg )
 {
-    FIXME(commdlg, "A really empty stub\n" );
+    FIXME("A really empty stub\n" );
     return FALSE;
 }
 
@@ -280,11 +280,11 @@
  LPPRINTER_INFO_2A lppi = PrintStructures->lpPrinterInfo;
  
 	SetWindowLongA(hDlg, DWL_USER, lParam); 
-	TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+	TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
 
 	if (lppd->lStructSize != sizeof(PRINTDLGA))
 	{
-		FIXME(commdlg,"structure size failure !!!\n");
+		FIXME("structure size failure !!!\n");
 /*		EndDialog (hDlg, 0); 
 		return FALSE; 
 */	}
@@ -346,7 +346,7 @@
         
 	/* Collate pages */
     if (lppd->Flags & PD_COLLATE)
-    	FIXME(commdlg, "PD_COLLATE not implemented yet\n");
+    	FIXME("PD_COLLATE not implemented yet\n");
         
     /* print to file */
    	CheckDlgButton(hDlg, chx1, (lppd->Flags & PD_PRINTTOFILE) ? 1 : 0);
@@ -363,7 +363,7 @@
 		 ShowWindow(GetDlgItem(hDlg, pshHelp), SW_HIDE);         
         }
 
-TRACE(commdlg, "succesful!\n");
+TRACE("succesful!\n");
   return TRUE;
 }
 
@@ -395,7 +395,7 @@
             nToPage < lppd->nMinPage || nToPage > lppd->nMaxPage)
         {
 			char TempBuffer[256];
-            FIXME(commdlg, "This MessageBox is not internationalised.");
+            FIXME("This MessageBox is not internationalised.");
          sprintf(TempBuffer, "This value lies not within Page range\n"
                              "Please enter a value between %d and %d",
                              lppd->nMinPage, lppd->nMaxPage);
@@ -427,17 +427,17 @@
     switch (LOWORD(wParam)) 
     {
 	 case IDOK:
-        TRACE(commdlg, " OK button was hit\n");
+        TRACE(" OK button was hit\n");
         if (PRINTDLG_ValidateAndDuplicateSettings(hDlg, PrintStructures) != TRUE)
         	return(FALSE);
 	    DestroyWindow(hDlg);
 	    return(TRUE);
 	 case IDCANCEL:
-        TRACE(commdlg, " CANCEL button was hit\n");
+        TRACE(" CANCEL button was hit\n");
         EndDialog(hDlg, FALSE);
 	    return(FALSE);
      case pshHelp:
-        TRACE(commdlg, " HELP button was hit\n");
+        TRACE(" HELP button was hit\n");
         SendMessageA(lppd->hwndOwner, PrintStructures->HelpMessageID, 
         			(WPARAM) hDlg, (LPARAM) lppd);
         break;
@@ -464,7 +464,7 @@
              ClosePrinter(hPrinter);
             }
          else
-            WARN(commdlg, " Call to OpenPrinter did not succeed!\n");
+            WARN(" Call to OpenPrinter did not succeed!\n");
          break;
         }
      case cmb4:							/* Printer combobox */
@@ -499,7 +499,7 @@
     PrintStructures=(PRINT_PTRA*) lParam;
     if (!PRINTDLG_WMInitDialog(hDlg, wParam, lParam, PrintStructures)) 
     {
-      TRACE(commdlg, "PRINTDLG_WMInitDialog returned FALSE\n");
+      TRACE("PRINTDLG_WMInitDialog returned FALSE\n");
       return FALSE;
     }  
     MessageBoxA(hDlg,"Warning: this dialog has no functionality yet!", 
@@ -528,7 +528,7 @@
   switch (wMsg)
     {
     case WM_INITDIALOG:
-      TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+      TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
       ShowWindow16(hWnd, SW_SHOWNORMAL);
       return (TRUE);
     case WM_COMMAND:
@@ -556,7 +556,7 @@
   switch (wMsg)
     {
     case WM_INITDIALOG:
-      TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
+      TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
       ShowWindow16(hWnd, SW_SHOWNORMAL);
       return (TRUE);
     case WM_COMMAND:
@@ -580,6 +580,6 @@
  *            PageSetupDlgA  (COMDLG32.15)
  */
 BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
-	FIXME(commdlg,"(%p), stub!\n",setupdlg);
+	FIXME("(%p), stub!\n",setupdlg);
 	return FALSE;
 }
diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c
index 55c034b..3a069d8 100644
--- a/dlls/shell32/brsfolder.c
+++ b/dlls/shell32/brsfolder.c
@@ -7,7 +7,7 @@
 #include "dlgs.h"
 #include "win.h"
 #include "sysmetrics.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winreg.h"
 #include "authors.h"
 #include "winnls.h"
@@ -41,7 +41,7 @@
 	hwndTreeView = GetDlgItem (hwndParent, IDD_TREEVIEW);
 	Shell_GetImageList(NULL, &hImageList);
 	
-	TRACE(shell,"dlg=%x tree=%x\n", hwndParent, hwndTreeView );
+	TRACE("dlg=%x tree=%x\n", hwndParent, hwndTreeView );
 
 	if (hImageList && hwndTreeView)
 	{ TreeView_SetImageList(hwndTreeView, hImageList, 0);
@@ -66,7 +66,7 @@
 }
 
 static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTVITEMA lpTV_ITEM)
-{	TRACE (shell,"%p %p\n",lpifq, lpTV_ITEM);
+{	TRACE("%p %p\n",lpifq, lpTV_ITEM);
 
 	lpTV_ITEM->iImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
 	lpTV_ITEM->iSelectedImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
@@ -86,14 +86,14 @@
 	BOOL   bSuccess=TRUE;
 	STRRET str;
 
-	TRACE(shell,"%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName);
+	TRACE("%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName);
 	if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str)))
 	{ bSuccess = StrRetToStrN (lpFriendlyName, MAX_PATH, &str, lpi);
 	}
 	else
 	  bSuccess = FALSE;
 
-	TRACE(shell,"-- %s\n",lpFriendlyName);
+	TRACE("-- %s\n",lpFriendlyName);
 	return bSuccess;
 }
 
@@ -110,7 +110,7 @@
 	char		szBuff[256];
 	HWND		hwnd=GetParent(hwndTreeView);
 
-	TRACE(shell, "%p %p %x\n",lpsf, pidl, (INT)hParent);
+	TRACE("%p %p %x\n",lpsf, pidl, (INT)hParent);
 	
 	SetCapture(GetParent(hwndTreeView));
 	SetCursor(LoadCursorA(0, IDC_WAITA));
@@ -176,13 +176,13 @@
 	IShellFolder *	lpsf2=0;
 	
 
-	TRACE(shell,"%x %x %p msg=%x\n", hWnd,  CtlID, lpnmh, pnmtv->hdr.code);
+	TRACE("%x %x %p msg=%x\n", hWnd,  CtlID, lpnmh, pnmtv->hdr.code);
 
 	switch (pnmtv->hdr.idFrom)
 	{ case IDD_TREEVIEW:
 	    switch (pnmtv->hdr.code)   
 	    { case TVN_DELETEITEM:
-	        { FIXME(shell,"TVN_DELETEITEM\n");
+	        { FIXME("TVN_DELETEITEM\n");
 		  lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam;
 	          IShellFolder_Release(lptvid->lpsfParent);
 	          SHFree(lptvid->lpi);  
@@ -192,7 +192,7 @@
 	        break;
 			
 	      case TVN_ITEMEXPANDING:
-		{ FIXME(shell,"TVN_ITEMEXPANDING\n");
+		{ FIXME("TVN_ITEMEXPANDING\n");
 		  if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
 	            break;
 		
@@ -209,7 +209,7 @@
 	        break;
 
 	      default:
-	        FIXME(shell,"unhandled\n");
+	        FIXME("unhandled\n");
 		break;
 	    }
 	    break;
@@ -227,20 +227,20 @@
  */
 BOOL WINAPI BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
                                LPARAM lParam )
-{    TRACE(shell,"hwnd=%i msg=%i 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
+{    TRACE("hwnd=%i msg=%i 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
 
 	switch(msg)
 	{ case WM_INITDIALOG:
 	    pidlRet = NULL;
 	    lpBrowseInfo = (LPBROWSEINFOA) lParam;
 	    if (lpBrowseInfo->lpfn)
-	      FIXME(shell,"Callbacks not implemented\n");
+	      FIXME("Callbacks not implemented\n");
 	    if (lpBrowseInfo->ulFlags)
-	      FIXME(shell,"flag %x not implemented\n", lpBrowseInfo->ulFlags);
+	      FIXME("flag %x not implemented\n", lpBrowseInfo->ulFlags);
 	    if (lpBrowseInfo->lpszTitle)
-	      FIXME(shell,"title %s not displayed\n", lpBrowseInfo->lpszTitle);
+	      FIXME("title %s not displayed\n", lpBrowseInfo->lpszTitle);
 	    if ( lpBrowseInfo->pidlRoot )
-	      FIXME(shell,"root is desktop\n");
+	      FIXME("root is desktop\n");
 
 	    InitializeTreeView ( hWnd);
 	    return 1;
@@ -272,7 +272,7 @@
  */
 LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOA lpbi)
 {
-	TRACE(shell, "(%lx,%s) empty stub!\n", (DWORD)lpbi, lpbi->lpszTitle);
+	TRACE("(%lx,%s) empty stub!\n", (DWORD)lpbi, lpbi->lpszTitle);
 
 	return (LPITEMIDLIST) DialogBoxParamA( shell32_hInstance,
 			"SHBRSFORFOLDER_MSGBOX", 0,
diff --git a/dlls/shell32/classes.c b/dlls/shell32/classes.c
index 02a3cf4..a7d3298 100644
--- a/dlls/shell32/classes.c
+++ b/dlls/shell32/classes.c
@@ -6,7 +6,7 @@
  */
 #include <stdlib.h>
 #include <string.h>
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 #include "winreg.h"
 
@@ -18,7 +18,7 @@
 BOOL HCR_MapTypeToValue ( LPCSTR szExtension, LPSTR szFileType, DWORD len)
 {	HKEY	hkey;
 
-	TRACE(shell, "%s %p\n",szExtension, szFileType );
+	TRACE("%s %p\n",szExtension, szFileType );
 
 	if (RegOpenKeyExA(HKEY_CLASSES_ROOT,szExtension,0,0x02000000,&hkey))
 	{ return FALSE;
@@ -31,7 +31,7 @@
 
 	RegCloseKey(hkey);
 
-	TRACE(shell, "-- %s\n", szFileType );
+	TRACE("-- %s\n", szFileType );
 
 	return TRUE;
 }
@@ -39,7 +39,7 @@
 {	HKEY	hkey;
 	char	sTemp[256];
 	
-	TRACE(shell, "%s %s\n",szClass, szVerb );
+	TRACE("%s %s\n",szClass, szVerb );
 
 	sprintf(sTemp, "%s\\shell\\%s\\command",szClass, szVerb);
 
@@ -53,7 +53,7 @@
 	}	
 	RegCloseKey(hkey);
 
-	TRACE(shell, "-- %s\n", szDest );
+	TRACE("-- %s\n", szDest );
 
 	return TRUE;
 
@@ -68,7 +68,7 @@
 	char	sTemp[256];
 	char	sNum[5];
 
-	TRACE(shell, "%s\n",szClass );
+	TRACE("%s\n",szClass );
 
 	sprintf(sTemp, "%s\\DefaultIcon",szClass);
 
@@ -89,7 +89,7 @@
 	
 	ParseFieldA (szDest, 1, szDest, len);
 	
-	TRACE(shell, "-- %s %li\n", szDest, *dwNr );
+	TRACE("-- %s %li\n", szDest, *dwNr );
 
 	return TRUE;
 
diff --git a/dlls/shell32/contmenu.c b/dlls/shell32/contmenu.c
index df46fbd..9d9af42 100644
--- a/dlls/shell32/contmenu.c
+++ b/dlls/shell32/contmenu.c
@@ -6,7 +6,7 @@
 #include <string.h>
 
 #include "winerror.h"
-#include "debug.h"
+#include "debugtools.h"
 
 #include "pidl.h"
 #include "wine/obj_base.h"
@@ -37,7 +37,7 @@
 */
 BOOL IContextMenu_AllocPidlTable(IContextMenuImpl *This, DWORD dwEntries)
 {
-	TRACE(shell,"(%p)->(entrys=%lu)\n",This, dwEntries);
+	TRACE("(%p)->(entrys=%lu)\n",This, dwEntries);
 
 	/*add one for NULL terminator */
 	dwEntries++;
@@ -57,7 +57,7 @@
 {
 	int   i;
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	if(This->aPidls)
 	{ for(i = 0; This->aPidls[i]; i++)
@@ -76,7 +76,7 @@
 {
 	UINT  i;
 
-	TRACE(shell,"(%p)->(apidl=%p count=%u)\n",This, aPidls, uItemCount);
+	TRACE("(%p)->(apidl=%p count=%u)\n",This, aPidls, uItemCount);
 
 	if(This->aPidls)
 	{ for(i = 0; i < uItemCount; i++)
@@ -94,7 +94,7 @@
 {	UINT  i;
 	DWORD dwAttributes;
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	if(This->aPidls)
 	{
@@ -138,7 +138,7 @@
 	for(u = 0; u < uItemCount; u++)
 	{ cm->bAllValues &= (_ILIsValue(aPidls[u]) ? 1 : 0);
 	}
-	TRACE(shell,"(%p)->()\n",cm);
+	TRACE("(%p)->()\n",cm);
 	shell32_ObjCount++;
 	return (IContextMenu*)cm;
 }
@@ -153,7 +153,7 @@
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
 
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -164,16 +164,16 @@
 	{ *ppvObj = This;
 	}   
 	else if(IsEqualIID(riid, &IID_IShellExtInit))  /*IShellExtInit*/
-	{ FIXME (shell,"-- LPSHELLEXTINIT pointer requested\n");
+	{ FIXME("-- LPSHELLEXTINIT pointer requested\n");
 	}
 
 	if(*ppvObj)
 	{ 
 	  IContextMenu_AddRef((IContextMenu*)*ppvObj);      
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }
 
@@ -184,7 +184,7 @@
 {
 	ICOM_THIS(IContextMenuImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This, This->ref);
+	TRACE("(%p)->(count=%lu)\n",This, This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -197,12 +197,12 @@
 {
 	ICOM_THIS(IContextMenuImpl, iface);
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying IContextMenu(%p)\n",This);
+	{ TRACE(" destroying IContextMenu(%p)\n",This);
 
 	  if(This->pSFParent)
 	    IShellFolder_Release(This->pSFParent);
@@ -262,7 +262,7 @@
 
 	BOOL	fExplore ;
 
-	TRACE(shell,"(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
+	TRACE("(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
 
 	if(!(CMF_DEFAULTONLY & uFlags))
 	{ if(!This->bAllValues)	
@@ -310,7 +310,7 @@
 	SHELLEXECUTEINFOA	sei;
 	int   i;
 
-	TRACE(shell,"(%p)->(invcom=%p verb=%p wnd=%x)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);    
+	TRACE("(%p)->(invcom=%p verb=%p wnd=%x)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);    
 
 	if(HIWORD(lpcmi->lpVerb))
 	{ /* get the active IShellView */
@@ -319,9 +319,9 @@
 	  IShellView_GetWindow(lpSV, &hWndSV);
 	  
 	  /* these verbs are used by the filedialogs*/
-	  TRACE(shell,"%s\n",lpcmi->lpVerb);
+	  TRACE("%s\n",lpcmi->lpVerb);
 	  if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDER))
-	  { FIXME(shell,"%s not implemented\n",lpcmi->lpVerb);
+	  { FIXME("%s not implemented\n",lpcmi->lpVerb);
 	  }
 	  else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLIST))
 	  { SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
@@ -330,7 +330,7 @@
 	  { SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
 	  } 
 	  else
-	  { FIXME(shell,"please report: unknown verb %s\n",lpcmi->lpVerb);
+	  { FIXME("please report: unknown verb %s\n",lpcmi->lpVerb);
 	  }
 	  IShellView_Release(lpSV);
 	  return NOERROR;
@@ -395,7 +395,7 @@
 
 	HRESULT  hr = E_INVALIDARG;
 
-	TRACE(shell,"(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
+	TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
 
 	switch(uFlags)
 	{ case GCS_HELPTEXT:
@@ -426,7 +426,7 @@
 	    hr = NOERROR;
 	    break;
 	}
-	TRACE(shell,"-- (%p)->(name=%s)\n",This, lpszName);
+	TRACE("-- (%p)->(name=%s)\n",This, lpszName);
 	return hr;
 }
 
@@ -444,7 +444,7 @@
 {
 	ICOM_THIS(IContextMenuImpl, iface);
 
-	TRACE(shell,"(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam);
+	TRACE("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam);
 
 	return E_NOTIMPL;
 }
diff --git a/dlls/shell32/dataobject.c b/dlls/shell32/dataobject.c
index e101244..c560a99 100644
--- a/dlls/shell32/dataobject.c
+++ b/dlls/shell32/dataobject.c
@@ -11,7 +11,7 @@
 #include "pidl.h"
 #include "winerror.h"
 #include "shell32_main.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(shell)
 
@@ -70,7 +70,7 @@
 	{ memcpy(ef->pFmt, afmt, size);
 	}
 
-	TRACE(shell,"(%p)->()\n",ef);
+	TRACE("(%p)->()\n",ef);
 	shell32_ObjCount++;
 	return (LPENUMFORMATETC)ef;
 }
@@ -79,7 +79,7 @@
 	ICOM_THIS(IEnumFORMATETCImpl,iface);
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 			*ppvObj = NULL;
 
@@ -92,29 +92,29 @@
 
 	if(*ppvObj)
 	{ IEnumFORMATETC_AddRef((IEnumFORMATETC*)*ppvObj);
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 
 }
 static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface)
 {
 	ICOM_THIS(IEnumFORMATETCImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This, This->ref);
+	TRACE("(%p)->(count=%lu)\n",This, This->ref);
 	shell32_ObjCount++;
 	return ++(This->ref);
 }
 static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface)
 {
 	ICOM_THIS(IEnumFORMATETCImpl,iface);
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying IEnumFORMATETC(%p)\n",This);
+	{ TRACE(" destroying IEnumFORMATETC(%p)\n",This);
 	  if (This->pFmt)
 	  { SHFree (This->pFmt);
 	  }
@@ -129,7 +129,7 @@
 	UINT cfetch;
 	HRESULT hres = S_FALSE;
 
-	TRACE (shell, "(%p)->()\n", This);
+	TRACE("(%p)->()\n", This);
 
         if (This->posFmt < This->countFmt)
         { cfetch = This->countFmt - This->posFmt;
@@ -153,7 +153,7 @@
 static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt)
 {
 	ICOM_THIS(IEnumFORMATETCImpl,iface);
-	FIXME (shell, "(%p)->(num=%lu)\n", This, celt);
+	FIXME("(%p)->(num=%lu)\n", This, celt);
 
 	This->posFmt += celt;
 	if (This->posFmt > This->countFmt)
@@ -165,7 +165,7 @@
 static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface)
 {
 	ICOM_THIS(IEnumFORMATETCImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 
         This->posFmt = 0;
         return S_OK;
@@ -173,7 +173,7 @@
 static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum)
 {
 	ICOM_THIS(IEnumFORMATETCImpl,iface);
-	FIXME (shell, "(%p)->(ppenum=%p)\n", This, ppenum);
+	FIXME("(%p)->(ppenum=%p)\n", This, ppenum);
 	return E_NOTIMPL;
 }
 
@@ -249,16 +249,16 @@
 	lpidll->uStep=uStep;
 	lpidll->dpa=NULL;
 
-	TRACE (shell,"(%p)\n",lpidll);
+	TRACE("(%p)\n",lpidll);
 	return lpidll;
 }
 void IDLList_Destructor(LPIDLLIST this)
-{	TRACE (shell,"(%p)\n",this);
+{	TRACE("(%p)\n",this);
 	IDLList_CleanList(this);
 }
  
 static UINT WINAPI IDLList_GetState(LPIDLLIST this)
-{	TRACE (shell,"(%p)->(uStep=%u dpa=%p)\n",this, this->uStep, this->dpa);
+{	TRACE("(%p)->(uStep=%u dpa=%p)\n",this, this->uStep, this->dpa);
 
 	if (this->uStep == 0)
 	{ if (this->dpa)
@@ -268,15 +268,15 @@
         return(State_UnInit);
 }
 static LPITEMIDLIST WINAPI IDLList_GetElement(LPIDLLIST this, UINT nIndex)
-{	TRACE (shell,"(%p)->(index=%u)\n",this, nIndex);
+{	TRACE("(%p)->(index=%u)\n",this, nIndex);
 	return((LPITEMIDLIST)pDPA_GetPtr(this->dpa, nIndex));
 }
 static UINT WINAPI IDLList_GetCount(LPIDLLIST this)
-{	TRACE (shell,"(%p)\n",this);
+{	TRACE("(%p)\n",this);
 	return(IDLList_GetState(this)==State_Init ? DPA_GetPtrCount(this->dpa) : 0);
 }
 static BOOL WINAPI IDLList_StoreItem(LPIDLLIST this, LPITEMIDLIST pidl)
-{	TRACE (shell,"(%p)->(pidl=%p)\n",this, pidl);
+{	TRACE("(%p)->(pidl=%p)\n",this, pidl);
 	if (pidl)
         { if (IDLList_InitList(this) && pDPA_InsertPtr(this->dpa, 0x7fff, (LPSTR)pidl)>=0)
 	    return(TRUE);
@@ -287,7 +287,7 @@
 }
 static BOOL WINAPI IDLList_AddItems(LPIDLLIST this, LPITEMIDLIST *apidl, UINT cidl)
 {	INT i;
-	TRACE (shell,"(%p)->(apidl=%p cidl=%u)\n",this, apidl, cidl);
+	TRACE("(%p)->(apidl=%p cidl=%u)\n",this, apidl, cidl);
 
 	for (i=0; i<cidl; ++i)
         { if (!IDLList_StoreItem(this, ILClone((LPCITEMIDLIST)apidl[i])))
@@ -296,7 +296,7 @@
         return(TRUE);
 }
 static BOOL WINAPI IDLList_InitList(LPIDLLIST this)
-{	TRACE (shell,"(%p)\n",this);
+{	TRACE("(%p)\n",this);
 	switch (IDLList_GetState(this))
         { case State_Init:
 	    return(TRUE);
@@ -313,7 +313,7 @@
 }
 static void WINAPI IDLList_CleanList(LPIDLLIST this)
 {	INT i;
-	TRACE (shell,"(%p)\n",this);
+	TRACE("(%p)\n",this);
 
 	if (this->uStep != 0)
         { this->dpa = NULL;
@@ -400,7 +400,7 @@
 	  
 	dto->lpill->lpvtbl->fnAddItems(dto->lpill, apidl, cidl); 
 	
-	TRACE(shell,"(%p)->(sf=%p apidl=%p cidl=%u)\n",dto, psf, apidl, cidl);
+	TRACE("(%p)->(sf=%p apidl=%p cidl=%u)\n",dto, psf, apidl, cidl);
 	shell32_ObjCount++;
 	return (LPDATAOBJECT)dto;
 }
@@ -412,7 +412,7 @@
 	ICOM_THIS(IDataObjectImpl,iface);
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -425,10 +425,10 @@
 
 	if(*ppvObj)
 	{ IDataObject_AddRef((IDataObject*)*ppvObj);      
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }   
 /**************************************************************************
@@ -438,7 +438,7 @@
 {
 	ICOM_THIS(IDataObjectImpl,iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This, This->ref);
+	TRACE("(%p)->(count=%lu)\n",This, This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -449,12 +449,12 @@
 static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying IDataObject(%p)\n",This);
+	{ TRACE(" destroying IDataObject(%p)\n",This);
 	  IDLList_Destructor(This->lpill);
 	  HeapFree(GetProcessHeap(),0,This);
 	  return 0;
@@ -523,7 +523,7 @@
 	HGLOBAL hmem;
 	
 	GetClipboardFormatNameA (pformatetcIn->cfFormat, temp, 256);
-	WARN (shell, "(%p)->(%p %p format=%s)semi-stub\n", This, pformatetcIn, pmedium, temp);
+	WARN("(%p)->(%p %p format=%s)semi-stub\n", This, pformatetcIn, pmedium, temp);
 
 	if (!DATAOBJECT_InitShellIDList())	/* is the clipformat registred? */
         { return(E_UNEXPECTED);
@@ -558,71 +558,71 @@
 	    pcida->aoffset[0] = size;
 	    pcida->aoffset[1] = size+size1;
 
-	    TRACE(shell,"-- %lu %lu %lu\n",size, size1, size2 );
-	    TRACE(shell,"-- %p %p\n",This->pidl, pidl);
-	    TRACE(shell,"-- %p %p %p\n",pcida, (LPBYTE)pcida+size,(LPBYTE)pcida+size+size1);
+	    TRACE("-- %lu %lu %lu\n",size, size1, size2 );
+	    TRACE("-- %p %p\n",This->pidl, pidl);
+	    TRACE("-- %p %p %p\n",pcida, (LPBYTE)pcida+size,(LPBYTE)pcida+size+size1);
 	    
 	    memcpy ((LPBYTE)pcida+size, This->pidl, size1);
 	    memcpy ((LPBYTE)pcida+size+size1, pidl, size2);
-	    TRACE(shell,"-- after copy\n");
+	    TRACE("-- after copy\n");
 
 	    GlobalUnlock(hmem);
 	    
 	    pmedium->tymed = TYMED_HGLOBAL;
 	    pmedium->u.hGlobal = (HGLOBAL)pcida;
 	    pmedium->pUnkForRelease = NULL;
-	    TRACE(shell,"-- ready\n");
+	    TRACE("-- ready\n");
 	    return(NOERROR);
 	  }
 	}
-	FIXME (shell, "-- clipformat not implemented\n");
+	FIXME("-- clipformat not implemented\n");
 	return (E_INVALIDARG);
 }
 static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
 static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise)
 {
 	ICOM_THIS(IDataObjectImpl,iface);
-	FIXME (shell, "(%p)->()\n", This);
+	FIXME("(%p)->()\n", This);
 	return E_NOTIMPL;
 }
diff --git a/dlls/shell32/enumidlist.c b/dlls/shell32/enumidlist.c
index eca48cb..29b0292 100644
--- a/dlls/shell32/enumidlist.c
+++ b/dlls/shell32/enumidlist.c
@@ -6,7 +6,7 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include "debug.h"
+#include "debugtools.h"
 #include "wine/obj_base.h"
 #include "wine/obj_enumidlist.h"
 #include "winerror.h"
@@ -55,7 +55,7 @@
 	lpeidl->mpLast=NULL;
 	lpeidl->mpCurrent=NULL;
 
-	TRACE(shell,"(%p)->(%s flags=0x%08lx)\n",lpeidl,debugstr_a(lpszPath),dwFlags);
+	TRACE("(%p)->(%s flags=0x%08lx)\n",lpeidl,debugstr_a(lpszPath),dwFlags);
 
 	if(!IEnumIDList_CreateEnumList((IEnumIDList*)lpeidl, lpszPath, dwFlags))
 	{ if (lpeidl)
@@ -64,7 +64,7 @@
 	  return NULL;
 	}
 
-	TRACE(shell,"-- (%p)->()\n",lpeidl);
+	TRACE("-- (%p)->()\n",lpeidl);
 	shell32_ObjCount++;
 	return (IEnumIDList*)lpeidl;
 }
@@ -81,7 +81,7 @@
 
 	char	xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -94,11 +94,11 @@
 
 	if(*ppvObj)
 	{ IEnumIDList_AddRef((IEnumIDList*)*ppvObj);
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
 	
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }
 
@@ -110,7 +110,7 @@
 {
 	ICOM_THIS(IEnumIDListImpl,iface);
 
-	TRACE(shell,"(%p)->(%lu)\n",This,This->ref);
+	TRACE("(%p)->(%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -123,12 +123,12 @@
 {
 	ICOM_THIS(IEnumIDListImpl,iface);
 
-	TRACE(shell,"(%p)->(%lu)\n",This,This->ref);
+	TRACE("(%p)->(%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying IEnumIDList(%p)\n",This);
+	{ TRACE(" destroying IEnumIDList(%p)\n",This);
 	  IEnumIDList_DeleteList((IEnumIDList*)This);
 	  HeapFree(GetProcessHeap(),0,This);
 	  return 0;
@@ -152,7 +152,7 @@
 	HRESULT  hr = S_OK;
 	LPITEMIDLIST  temp;
 
-	TRACE(shell,"(%p)->(%ld,%p, %p)\n",This,celt,rgelt,pceltFetched);
+	TRACE("(%p)->(%ld,%p, %p)\n",This,celt,rgelt,pceltFetched);
 
 /* It is valid to leave pceltFetched NULL when celt is 1. Some of explorer's
  * subsystems actually use it (and so may a third party browser)
@@ -193,7 +193,7 @@
 	DWORD    dwIndex;
 	HRESULT  hr = S_OK;
 
-	TRACE(shell,"(%p)->(%lu)\n",This,celt);
+	TRACE("(%p)->(%lu)\n",This,celt);
 
 	for(dwIndex = 0; dwIndex < celt; dwIndex++)
 	{ if(!This->mpCurrent)
@@ -212,7 +212,7 @@
 {
 	ICOM_THIS(IEnumIDListImpl,iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 	This->mpCurrent = This->mpFirst;
 	return S_OK;
 }
@@ -224,7 +224,7 @@
 {
 	ICOM_THIS(IEnumIDListImpl,iface);
 
-	TRACE(shell,"(%p)->() to (%p)->() E_NOTIMPL\n",This,ppenum);
+	TRACE("(%p)->() to (%p)->() E_NOTIMPL\n",This,ppenum);
 	return E_NOTIMPL;
 }
 /**************************************************************************
@@ -247,7 +247,7 @@
 	CHAR  szDriveName[4];
 	CHAR  szPath[MAX_PATH];
 
-	TRACE(shell,"(%p)->(path=%s flags=0x%08lx) \n",This,debugstr_a(lpszPath),dwFlags);
+	TRACE("(%p)->(path=%s flags=0x%08lx) \n",This,debugstr_a(lpszPath),dwFlags);
 
 	if (lpszPath && lpszPath[0]!='\0')
 	{ strcpy(szPath, lpszPath);
@@ -260,7 +260,7 @@
 	{ /* special case - we can't enumerate the Desktop level Objects (MyComputer,Nethood...
 	  so we need to fake an enumeration of those.*/
 	  if(!lpszPath)
-	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS (special) items\n",This);
+	  { TRACE("-- (%p)-> enumerate SHCONTF_FOLDERS (special) items\n",This);
 	    /*create the pidl for This item */
 	    pidl = _ILCreateMyComputer();
 	    if(pidl)
@@ -269,7 +269,7 @@
 	    }
 	  }   
 	  else if (lpszPath[0]=='\0') /* enumerate the drives*/
-	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS (drives)\n",This);
+	  { TRACE("-- (%p)-> enumerate SHCONTF_FOLDERS (drives)\n",This);
 	    dwDrivemap = GetLogicalDrives();
 	    strcpy (szDriveName,"A:\\");
 	    while (szDriveName[0]<='Z')
@@ -285,7 +285,7 @@
 	    }   
 	  }
 	  else
-	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",This,debugstr_a(szPath));
+	  { TRACE("-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",This,debugstr_a(szPath));
 	    hFile = FindFirstFileA(szPath,&stffile);
 	    if ( hFile != INVALID_HANDLE_VALUE )
 	    { do
@@ -312,7 +312,7 @@
 	/*enumerate the non-folder items (values) */
 	if(dwFlags & SHCONTF_NONFOLDERS)
 	{ if(lpszPath)
-	  { TRACE (shell,"-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",This,debugstr_a(szPath));
+	  { TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",This,debugstr_a(szPath));
 	    hFile = FindFirstFileA(szPath,&stffile);
 	    if ( hFile != INVALID_HANDLE_VALUE )
 	    { do
@@ -350,7 +350,7 @@
 
  LPENUMLIST  pNew;
 
-  TRACE(shell,"(%p)->(pidl=%p)\n",This,pidl);
+  TRACE("(%p)->(pidl=%p)\n",This,pidl);
   pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST));
   if(pNew)
   { /*set the next pointer */
@@ -370,7 +370,7 @@
    
     /*update the last item pointer */
     This->mpLast = pNew;
-    TRACE(shell,"-- (%p)->(first=%p, last=%p)\n",This,This->mpFirst,This->mpLast);
+    TRACE("-- (%p)->(first=%p, last=%p)\n",This,This->mpFirst,This->mpLast);
     return TRUE;
   }
   return FALSE;
@@ -385,7 +385,7 @@
 
 	LPENUMLIST  pDelete;
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 	
 	while(This->mpFirst)
 	{ pDelete = This->mpFirst;
diff --git a/dlls/shell32/folders.c b/dlls/shell32/folders.c
index cb524ee..f83082e 100644
--- a/dlls/shell32/folders.c
+++ b/dlls/shell32/folders.c
@@ -10,7 +10,7 @@
 #include "wine/obj_base.h"
 #include "wine/obj_extracticon.h"
 
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 
 #include "pidl.h"
@@ -51,7 +51,7 @@
 
 	pdump(pidl);
 
-	TRACE(shell,"(%p)\n",ei);
+	TRACE("(%p)\n",ei);
 	shell32_ObjCount++;
 	return (IExtractIconA *)ei;
 }
@@ -64,7 +64,7 @@
 
 	char	xriid[50];
 	 WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	 TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -80,10 +80,10 @@
 
 	if(*ppvObj)
 	{ IExtractIconA_AddRef((IExtractIconA*) *ppvObj);  	
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }
 
@@ -94,7 +94,7 @@
 {
 	ICOM_THIS(IExtractIconAImpl,iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This, This->ref );
+	TRACE("(%p)->(count=%lu)\n",This, This->ref );
 
 	shell32_ObjCount++;
 
@@ -107,12 +107,12 @@
 {
 	ICOM_THIS(IExtractIconAImpl,iface);
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying IExtractIcon(%p)\n",This);
+	{ TRACE(" destroying IExtractIcon(%p)\n",This);
 	  SHFree(This->pidl);
 	  HeapFree(GetProcessHeap(),0,This);
 	  return 0;
@@ -136,7 +136,7 @@
 	DWORD	ret = S_FALSE, dwNr;
 	LPITEMIDLIST	pSimplePidl = ILFindLastID(This->pidl);
 			
-	TRACE (shell,"(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags);
+	TRACE("(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags);
 
 	if (pwFlags)
 	  *pwFlags = 0;
@@ -195,7 +195,7 @@
 	  }
 	}
 
-	TRACE (shell,"-- %s %x\n", (ret==NOERROR)?debugstr_a(szIconFile):"[error]", *piIndex);
+	TRACE("-- %s %x\n", (ret==NOERROR)?debugstr_a(szIconFile):"[error]", *piIndex);
 	return ret;
 }
 /**************************************************************************
@@ -205,7 +205,7 @@
 {
 	ICOM_THIS(IExtractIconAImpl,iface);
 
-	FIXME (shell,"(%p) (file=%p index=%u %p %p size=%u) semi-stub\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
+	FIXME("(%p) (file=%p index=%u %p %p size=%u) semi-stub\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
 
 	if (phiconLarge)
 	  *phiconLarge = pImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT);
@@ -284,7 +284,7 @@
 static HRESULT WINAPI IEIPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode)
 {
 	_ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
-	FIXME(shell,"%p\n", This);
+	FIXME("%p\n", This);
 	return E_NOTIMPL;
 
 }
diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index 608810c..6e5ec75 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -12,7 +12,7 @@
 #include "cursoricon.h"
 #include "module.h"
 #include "heap.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winversion.h"
 
 #include "shellapi.h"
@@ -48,14 +48,14 @@
 #if 0
 static void dumpIcoDirEnty ( LPicoICONDIRENTRY entry )
 {	
-	TRACE (shell, "width = 0x%08x height = 0x%08x\n", entry->bWidth, entry->bHeight);
-	TRACE (shell, "colors = 0x%08x planes = 0x%08x\n", entry->bColorCount, entry->wPlanes);
-	TRACE (shell, "bitcount = 0x%08x bytesinres = 0x%08lx offset = 0x%08lx\n", 
+	TRACE("width = 0x%08x height = 0x%08x\n", entry->bWidth, entry->bHeight);
+	TRACE("colors = 0x%08x planes = 0x%08x\n", entry->bColorCount, entry->wPlanes);
+	TRACE("bitcount = 0x%08x bytesinres = 0x%08lx offset = 0x%08lx\n", 
 	entry->wBitCount, entry->dwBytesInRes, entry->dwImageOffset);
 }
 static void dumpIcoDir ( LPicoICONDIR entry )
 {	
-	TRACE (shell, "type = 0x%08x count = 0x%08x\n", entry->idType, entry->idCount);
+	TRACE("type = 0x%08x count = 0x%08x\n", entry->idType, entry->idCount);
 }
 #endif
 /*************************************************************************
@@ -66,7 +66,7 @@
 	char			magic[4];
 	int			size;
 
-	TRACE(shell,"0x%08x %p\n", hFile, retptr);  
+	TRACE("0x%08x %p\n", hFile, retptr);  
 
 	*retptr = NULL;
 	_llseek( hFile, 0, SEEK_SET );
@@ -121,7 +121,7 @@
 static BYTE * SHELL_LoadResource( HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift, ULONG *uSize)
 {	BYTE*  ptr;
 
-	TRACE(shell,"0x%08x %p 0x%08x\n", hFile, pNInfo, sizeShift);
+	TRACE("0x%08x %p 0x%08x\n", hFile, pNInfo, sizeShift);
 
 	*uSize = (DWORD)pNInfo->length << sizeShift;
 	if( (ptr = (BYTE*)HeapAlloc(GetProcessHeap(),0, *uSize) ))
@@ -138,7 +138,7 @@
 static BYTE * ICO_LoadIcon( HFILE hFile, LPicoICONDIRENTRY lpiIDE, ULONG *uSize)
 {	BYTE*  ptr;
 
-	TRACE(shell,"0x%08x %p\n", hFile, lpiIDE);
+	TRACE("0x%08x %p\n", hFile, lpiIDE);
 
 	*uSize = lpiIDE->dwBytesInRes;
 	if( (ptr = (BYTE*)HeapAlloc(GetProcessHeap(),0, *uSize)) )
@@ -164,7 +164,7 @@
 	LPicoICONDIR	lpiID;	/* icon resource in file format */
 	int		i;
 
-	TRACE(shell,"0x%08x %p\n", hFile, lplpiID); 
+	TRACE("0x%08x %p\n", hFile, lplpiID); 
 	
 	_llseek( hFile, 0, SEEK_SET );
 	if( _lread(hFile,(char*)&lpcid, HEADER_SIZE_FILE) != HEADER_SIZE_FILE )
@@ -224,7 +224,7 @@
 	HANDLE		fmapping;
 	ULONG		uSize;
 	
-	TRACE(shell,"(file %s,start %d,extract %d\n", lpszExeFileName, nIconIndex, n);
+	TRACE("(file %s,start %d,extract %d\n", lpszExeFileName, nIconIndex, n);
 
 	if( hFile == HFILE_ERROR || !n )
 	  return ICO_INVALID_FILE;
@@ -239,25 +239,25 @@
 	  NE_NAMEINFO	*pIconDir = NULL;
 	  LPicoICONDIR	lpiID = NULL;
 
-	  TRACE(shell,"-- OS2/icon Signature (0x%08lx)\n", sig);
+	  TRACE("-- OS2/icon Signature (0x%08lx)\n", sig);
 
 	  if( pData == (BYTE*)-1 )
 	  { pCIDir = ICO_GetIconDirectory(hFile, &lpiID, &uSize);	/* check for .ICO file */
 	    if( pCIDir ) 
 	    { iconDirCount = 1; iconCount = lpiID->idCount;
-	      TRACE(shell,"-- icon found %p 0x%08lx 0x%08x 0x%08x\n", pCIDir, uSize, iconDirCount, iconCount);
+	      TRACE("-- icon found %p 0x%08lx 0x%08x 0x%08x\n", pCIDir, uSize, iconDirCount, iconCount);
 	    }
 	  }
 	  else while( pTInfo->type_id && !(pIconStorage && pIconDir) )
 	  { if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON )	/* find icon directory and icon repository */
 	    { iconDirCount = pTInfo->count;
 	      pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
-	      TRACE(shell,"\tfound directory - %i icon families\n", iconDirCount);
+	      TRACE("\tfound directory - %i icon families\n", iconDirCount);
 	    }
 	    if( pTInfo->type_id == NE_RSCTYPE_ICON ) 
 	    { iconCount = pTInfo->count;
 	      pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
-	      TRACE(shell,"\ttotal icons - %i\n", iconCount);
+	      TRACE("\ttotal icons - %i\n", iconCount);
 	    }
 	    pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
 	  }
@@ -320,13 +320,13 @@
 	  int			i,j;
 		  
 	  if ( !(fmapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL))) 
-	  { WARN(shell,"failed to create filemap.\n");	/* FIXME, INVALID_HANDLE_VALUE? */
+	  { WARN("failed to create filemap.\n");	/* FIXME, INVALID_HANDLE_VALUE? */
 	    hRet = ICO_INVALID_FILE;
 	    goto end_2;		/* failure */
 	  }
 
 	  if ( !(peimage = MapViewOfFile(fmapping,FILE_MAP_READ,0,0,0))) 
-	  { WARN(shell,"failed to mmap filemap.\n");
+	  { WARN("failed to mmap filemap.\n");
 	    hRet = ICO_INVALID_FILE;
 	    goto end_2;		/* failure */
 	  }
@@ -347,12 +347,12 @@
 	  }
 
 	  if (!rootresdir) 
-	  { WARN(shell,"haven't found section for resource directory.\n");
+	  { WARN("haven't found section for resource directory.\n");
 	    goto end_4;		/* failure */
 	  }
   /* search the group icon dir*/
 	  if (!(icongroupresdir = GetResDirEntryW(rootresdir,RT_GROUP_ICONW, (DWORD)rootresdir,FALSE))) 
-	  { WARN(shell,"No Icongroupresourcedirectory!\n");
+	  { WARN("No Icongroupresourcedirectory!\n");
 	    goto end_4;		/* failure */
 	  }
 	  iconDirCount = icongroupresdir->NumberOfNamedEntries+icongroupresdir->NumberOfIdEntries;
@@ -364,7 +364,7 @@
 	  }
 
 	  if (nIconIndex >= iconDirCount) 
-	  { WARN(shell,"nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount);
+	  { WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount);
 	    goto end_4;		/* failure */
 	  }
 
@@ -398,14 +398,14 @@
 	    }
 
 	    if (!igdata) 
-	    { WARN(shell,"no matching real address for icongroup!\n");
+	    { WARN("no matching real address for icongroup!\n");
 	      goto end_4;	/* failure */
 	    }
 	    RetPtr[i] = (HICON)pLookupIconIdFromDirectoryEx(igdata, TRUE, cxDesired, cyDesired, LR_DEFAULTCOLOR);
 	  }
 
 	  if (!(iconresdir=GetResDirEntryW(rootresdir,RT_ICONW,(DWORD)rootresdir,FALSE))) 
-	  { WARN(shell,"No Iconresourcedirectory!\n");
+	  { WARN("No Iconresourcedirectory!\n");
 	    goto end_4;		/* failure */
 	  }
 
@@ -425,7 +425,7 @@
 	      idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
 	    }
 	    if (!idata) 
-	    { WARN(shell,"no matching real address found for icondata!\n");
+	    { WARN("no matching real address found for icondata!\n");
 	      RetPtr[i]=0;
 	      continue;
 	    }
@@ -467,7 +467,7 @@
  *  Callback for DPA_Search
  */
 INT CALLBACK SIC_CompareEntrys( LPVOID p1, LPVOID p2, LPARAM lparam)
-{	TRACE(shell,"%p %p\n", p1, p2);
+{	TRACE("%p %p\n", p1, p2);
 
 	if (((LPSIC_ENTRY)p1)->dwSourceIndex != ((LPSIC_ENTRY)p2)->dwSourceIndex) /* first the faster one*/
 	  return 1;
@@ -487,7 +487,7 @@
 {	LPSIC_ENTRY lpsice;
 	INT index, index1;
 	
-	TRACE(shell,"%s %i %x %x\n", sSourceFile, dwSourceIndex, hSmallIcon ,hBigIcon);
+	TRACE("%s %i %x %x\n", sSourceFile, dwSourceIndex, hSmallIcon ,hBigIcon);
 
 	lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY));
 
@@ -504,7 +504,7 @@
 	index1= pImageList_AddIcon (ShellBigIconList, hBigIcon);
 
 	if (index!=index1)
-	{ FIXME(shell,"iconlists out of sync 0x%x 0x%x\n", index, index1);
+	{ FIXME("iconlists out of sync 0x%x 0x%x\n", index, index1);
 	}
 	lpsice->dwListIndex = index;
 	
@@ -526,7 +526,7 @@
 
 
 	if ( !hiconLarge ||  !hiconSmall)
-	{ WARN(shell, "failure loading icon %i from %s (%x %x)\n", dwSourceIndex, sSourceFile, hiconLarge, hiconSmall);
+	{ WARN("failure loading icon %i from %s (%x %x)\n", dwSourceIndex, sSourceFile, hiconLarge, hiconSmall);
 	  return -1;
 	}
 	return SIC_IconAppend (sSourceFile, dwSourceIndex, hiconSmall, hiconLarge);		
@@ -546,7 +546,7 @@
 {	SIC_ENTRY sice;
 	INT index = INVALID_INDEX;
 		
-	TRACE(shell,"%s %i\n", sSourceFile, dwSourceIndex);
+	TRACE("%s %i\n", sSourceFile, dwSourceIndex);
 
 	sice.sSourceFile = PathFindFilenameA(sSourceFile);
 	sice.dwSourceIndex = dwSourceIndex;
@@ -559,7 +559,7 @@
 	{  return SIC_LoadIcon (sSourceFile, dwSourceIndex);
 	}
 	
-	TRACE(shell, "-- found\n");
+	TRACE("-- found\n");
 	return ((LPSIC_ENTRY)pDPA_GetPtr(hdpa, index))->dwListIndex;
 }
 /****************************************************************************
@@ -571,7 +571,7 @@
 static HICON WINE_UNUSED SIC_GetIcon (LPCSTR sSourceFile, INT dwSourceIndex, BOOL bSmallIcon )
 {	INT index;
 
-	TRACE(shell,"%s %i\n", sSourceFile, dwSourceIndex);
+	TRACE("%s %i\n", sSourceFile, dwSourceIndex);
 
 	index = SIC_GetIconIndex(sSourceFile, dwSourceIndex);
 	if (INVALID_INDEX == index)
@@ -596,7 +596,7 @@
 	HICON		*pSmRet, *pLgRet;
 	UINT		index;
 
-	TRACE(shell,"\n");
+	TRACE("\n");
 
 	if (hdpa)	/* already initialized?*/
 	  return TRUE;
@@ -624,9 +624,9 @@
 
 	for (index=0; index<40; index++)
 	{ if (! pSmRet[index] )
-	  { MSG("*** failure loading resources from %s\n", szShellPath );
-	    MSG("*** this is a hack for loading the internal and external dll at the same time\n");
-	    MSG("*** you can ignore it but you will miss some icons in win95 dialogs\n\n");
+	  { MESSAGE("*** failure loading resources from %s\n", szShellPath );
+	    MESSAGE("*** this is a hack for loading the internal and external dll at the same time\n");
+	    MESSAGE("*** you can ignore it but you will miss some icons in win95 dialogs\n\n");
 	    break;
 	  }
 	  SIC_IconAppend (szShellPath, index, pSmRet[index], pLgRet[index]);
@@ -638,7 +638,7 @@
 	GlobalUnlock(hSmRet);
 	GlobalFree(hSmRet);
 
-	TRACE(shell,"hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList);
+	TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList);
 
 	return TRUE;
 }
@@ -668,7 +668,7 @@
  *
  */
 BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList)
-{	TRACE(shell,"(%p,%p)\n",lpBigList,lpSmallList);
+{	TRACE("(%p,%p)\n",lpBigList,lpSmallList);
 	if (lpBigList)
 	{ *lpBigList = ShellBigIconList;
 	}
@@ -696,7 +696,7 @@
 	BOOL		ret = FALSE;
 	UINT		dwFlags = 0;
 	
-	TRACE(shell,"sf=%p pidl=%p\n", sh, pidl);
+	TRACE("sf=%p pidl=%p\n", sh, pidl);
 
 	if (SUCCEEDED (IShellFolder_GetUIObjectOf(sh, 0, 1, &pidl, &IID_IExtractIconA, 0, (void **)&ei)))
 	{
@@ -727,7 +727,7 @@
 {
 	UINT	Index;
 
-	WARN(shell,"(SF=%p,pidl=%p,%p)\n",sh,pidl,pIndex);
+	WARN("(SF=%p,pidl=%p,%p)\n",sh,pidl,pIndex);
 	pdump(pidl);
 	
 	if (pIndex)
@@ -742,7 +742,7 @@
  */
 INT WINAPI Shell_GetCachedImageIndexA(LPCSTR szPath, INT nIndex, BOOL bSimulateDoc) 
 {
-	WARN(shell,"(%s,%08x,%08x) semi-stub.\n",debugstr_a(szPath), nIndex, bSimulateDoc);
+	WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_a(szPath), nIndex, bSimulateDoc);
 	return SIC_GetIconIndex(szPath, nIndex);
 }
 
@@ -750,7 +750,7 @@
 {	INT ret;
 	LPSTR sTemp = HEAP_strdupWtoA (GetProcessHeap(),0,szPath);
 	
-	WARN(shell,"(%s,%08x,%08x) semi-stub.\n",debugstr_w(szPath), nIndex, bSimulateDoc);
+	WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_w(szPath), nIndex, bSimulateDoc);
 
 	ret = SIC_GetIconIndex(sTemp, nIndex);
 	HeapFree(GetProcessHeap(),0,sTemp);
@@ -781,7 +781,7 @@
 HICON WINAPI ExtractIconExA ( LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons )
 {	HICON ret=0;
 	
-	TRACE(shell,"file=%s idx=%i %p %p num=%i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons );
+	TRACE("file=%s idx=%i %p %p num=%i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons );
 
 	if (nIconIndex==-1)	/* Number of icons requested */
 	  return ICO_ExtractIconEx(lpszFile, NULL, -1, 0, 0, 0  );
@@ -814,7 +814,7 @@
 {	LPSTR sFile;
 	DWORD ret;
 	
-	TRACE(shell,"file=%s idx=%i %p %p num=%i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons );
+	TRACE("file=%s idx=%i %p %p num=%i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons );
 
 	sFile = HEAP_strdupWtoA (GetProcessHeap(),0,lpszFile);
 	ret = ExtractIconExA ( sFile, nIconIndex, phiconLarge, phiconSmall, nIcons);
diff --git a/dlls/shell32/regstream.c b/dlls/shell32/regstream.c
index 68dab92..c3ce619 100644
--- a/dlls/shell32/regstream.c
+++ b/dlls/shell32/regstream.c
@@ -5,7 +5,7 @@
 
 #include "wine/obj_storage.h"
 
-#include "debug.h"
+#include "debugtools.h"
 #include "heap.h"
 #include "winerror.h"
 #include "winreg.h"
@@ -48,7 +48,7 @@
 	      { if (dwType == REG_BINARY )
 	        { rstr->pszSubKey = HEAP_strdupA (GetProcessHeap(),0, pszSubKey);
 	          rstr->pszValue = HEAP_strdupA (GetProcessHeap(),0, pszValue);		
-	          TRACE(shell,"(%p)->0x%08x,%s,%s,0x%08lx\n", rstr, hKey, pszSubKey, pszValue, grfMode);
+	          TRACE("(%p)->0x%08x,%s,%s,0x%08lx\n", rstr, hKey, pszSubKey, pszValue, grfMode);
 	          shell32_ObjCount++;
 	          return (IStream*)rstr;
 	        }
@@ -73,7 +73,7 @@
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
 
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -87,10 +87,10 @@
 	if(*ppvObj)
 	{ 
 	  IStream_AddRef((IStream*)*ppvObj);      
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }
 
@@ -101,7 +101,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This, This->ref);
+	TRACE("(%p)->(count=%lu)\n",This, This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -114,12 +114,12 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying SHReg IStream (%p)\n",This);
+	{ TRACE(" destroying SHReg IStream (%p)\n",This);
 
 	  if (This->pszSubKey)
 	    HeapFree(GetProcessHeap(),0,This->pszSubKey);
@@ -145,7 +145,7 @@
 
 	DWORD dwBytesToRead, dwBytesLeft;
 	
-	TRACE(shell,"(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead);
+	TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead);
 	
 	if ( !pv )
 	  return STG_E_INVALIDPOINTER;
@@ -170,7 +170,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -178,7 +178,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -186,7 +186,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -194,7 +194,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -202,7 +202,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -210,7 +210,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -218,7 +218,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -226,7 +226,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -234,7 +234,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -242,7 +242,7 @@
 {
 	ICOM_THIS(ISHRegStream, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	return E_NOTIMPL;
 }
@@ -275,6 +275,6 @@
  */
 IStream * WINAPI OpenRegStream(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode)
 {
-	TRACE(shell,"(0x%08x,%s,%s,0x%08lx)\n",hkey, pszSubkey, pszValue, grfMode);
+	TRACE("(0x%08x,%s,%s,0x%08lx)\n",hkey, pszSubkey, pszValue, grfMode);
 	return IStream_Constructor(hkey, pszSubkey, pszValue, grfMode);
 }
diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c
index fca690e..c60c919 100644
--- a/dlls/shell32/shelllink.c
+++ b/dlls/shell32/shelllink.c
@@ -6,7 +6,7 @@
  */
 
 #include <string.h>
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 
 #include "wine/obj_base.h"
@@ -81,7 +81,7 @@
 	sl->sPath = NULL;
 	sl->pPidl = NULL;
 			
-	TRACE(shell,"(%p)->()\n",sl);
+	TRACE("(%p)->()\n",sl);
 	shell32_ObjCount++;
 	return sl;
 }
@@ -96,7 +96,7 @@
 
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
+	TRACE("(%p)->(\n\tIID:\t%s)\n",This,xriid);
 
 	*ppvObj = NULL;
 
@@ -109,10 +109,10 @@
 
 	if(*ppvObj)
 	{ IPersistFile_AddRef((IPersistFile*)*ppvObj);      
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }  
 /******************************************************************************
@@ -122,7 +122,7 @@
 {
 	ICOM_THIS(IPersistFileImpl,iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -134,12 +134,12 @@
 {
 	ICOM_THIS(IPersistFileImpl,iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IPersistFile(%p)\n",This);
+	{ TRACE("-- destroying IPersistFile(%p)\n",This);
 	  if (This->sPath)
 	    HeapFree(GetProcessHeap(),0,This->sPath);
 	  if (This->pPidl)
@@ -153,13 +153,13 @@
 static HRESULT WINAPI IPersistFile_fnGetClassID(const IPersistFile* iface, CLSID *pClassID)
 {
 	ICOM_CTHIS(IPersistFile,iface);
-	FIXME(shell,"(%p)\n",This);
+	FIXME("(%p)\n",This);
 	return NOERROR;
 }
 static HRESULT WINAPI IPersistFile_fnIsDirty(const IPersistFile* iface)
 {
 	ICOM_CTHIS(IPersistFile,iface);
-	FIXME(shell,"(%p)\n",This);
+	FIXME("(%p)\n",This);
 	return NOERROR;
 }
 static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode)
@@ -174,22 +174,22 @@
 	HRESULT		hRet = E_FAIL;
 	CHAR		sTemp[512];
 	
-	TRACE(shell,"(%p)->(%s)\n",This,sFile); 
+	TRACE("(%p)->(%s)\n",This,sFile); 
 
 	HeapFree(GetProcessHeap(),0,sFile);
 
 	if ( !(hMapping = CreateFileMappingA(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL))) 
-	{ WARN(shell,"failed to create filemap.\n");
+	{ WARN("failed to create filemap.\n");
 	  goto end_1;
 	}
 
 	if ( !(pImage = (PLINK_HEADER) MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0))) 
-	{ WARN(shell,"failed to mmap filemap.\n");
+	{ WARN("failed to mmap filemap.\n");
 	  goto end_2;	
 	}
 	
 	if (!( (pImage->MagicStr == 0x0000004CL) && IsEqualIID(&pImage->MagicGuid, &CLSID_ShellLink)))
-	{ TRACE(shell,"file isn't a lnk\n");
+	{ TRACE("file isn't a lnk\n");
 	  goto end_3;
 	}
 	
@@ -197,15 +197,15 @@
 	  SYSTEMTIME time;
 	  FileTimeToSystemTime (&pImage->Time1, &time);
 	  GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL,  sTemp, 256);
-	  TRACE(shell, "-- time1: %s\n", sTemp);
+	  TRACE("-- time1: %s\n", sTemp);
 
 	  FileTimeToSystemTime (&pImage->Time2, &time);
 	  GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL,  sTemp, 256);
-	  TRACE(shell, "-- time2: %s\n", sTemp);
+	  TRACE("-- time2: %s\n", sTemp);
 
 	  FileTimeToSystemTime (&pImage->Time3, &time);
 	  GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL,  sTemp, 256);
-	  TRACE(shell, "-- time3: %s\n", sTemp);
+	  TRACE("-- time3: %s\n", sTemp);
 	  pdump (&pImage->Pidl);
 	}
 
@@ -228,19 +228,19 @@
 static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFileName, BOOL fRemember)
 {
 	ICOM_THIS(IPersistFileImpl,iface);
-	FIXME(shell,"(%p)->(%s)\n",This,debugstr_w(pszFileName));
+	FIXME("(%p)->(%s)\n",This,debugstr_w(pszFileName));
        	return NOERROR;
 }
 static HRESULT WINAPI IPersistFile_fnSaveCompleted(IPersistFile* iface, LPCOLESTR pszFileName)
 {
 	ICOM_THIS(IPersistFileImpl,iface);
-	FIXME(shell,"(%p)->(%s)\n",This,debugstr_w(pszFileName));
+	FIXME("(%p)->(%s)\n",This,debugstr_w(pszFileName));
         return NOERROR;
 }
 static HRESULT WINAPI IPersistFile_fnGetCurFile(const IPersistFile* iface, LPOLESTR *ppszFileName)
 {
 	ICOM_CTHIS(IPersistFileImpl,iface);
-	FIXME(shell,"(%p)\n",This);
+	FIXME("(%p)\n",This);
 	return NOERROR;
 }
   
@@ -282,7 +282,7 @@
 	lpclf= (IClassFactoryImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactoryImpl));
 	lpclf->ref = 1;
 	lpclf->lpvtbl = &slcfvt;
-	TRACE(shell,"(%p)->()\n",lpclf);
+	TRACE("(%p)->()\n",lpclf);
 	shell32_ObjCount++;
 	return (LPCLASSFACTORY)lpclf;
 }
@@ -295,7 +295,7 @@
 	ICOM_THIS(IClassFactoryImpl,iface);
 	char	xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
+	TRACE("(%p)->(\n\tIID:\t%s)\n",This,xriid);
 
 	*ppvObj = NULL;
 
@@ -308,10 +308,10 @@
 
 	if(*ppvObj)
 	{ IUnknown_AddRef((IUnknown*)*ppvObj);  	
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }  
 /******************************************************************************
@@ -320,7 +320,7 @@
 static ULONG WINAPI IShellLink_CF_AddRef(IClassFactory* iface)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -331,11 +331,11 @@
 static ULONG WINAPI IShellLink_CF_Release(IClassFactory* iface)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IClassFactory(%p)\n",This);
+	{ TRACE("-- destroying IClassFactory(%p)\n",This);
 		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
@@ -353,7 +353,7 @@
 	char	xriid[50];
 
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,xriid,ppObject);
+	TRACE("%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,xriid,ppObject);
 
 	*ppObject = NULL;
 		
@@ -365,7 +365,7 @@
 	{ pObj = (IUnknown *)IShellLink_Constructor();
 	} 
 	else
-	{ ERR(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);
+	{ ERR("unknown IID requested\n\tIID:\t%s\n",xriid);
 	  return(E_NOINTERFACE);
 	}
 	
@@ -375,7 +375,7 @@
 	 
 	hres = IUnknown_QueryInterface(pObj,riid, ppObject);
 	IUnknown_Release(pObj);
-	TRACE(shell,"-- Object created: (%p)->%p\n",This,*ppObject);
+	TRACE("-- Object created: (%p)->%p\n",This,*ppObject);
 
 	return hres;
 }
@@ -385,7 +385,7 @@
 static HRESULT WINAPI IShellLink_CF_LockServer(IClassFactory* iface, BOOL fLock)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"%p->(0x%x), not implemented\n",This, fLock);
+	TRACE("%p->(0x%x), not implemented\n",This, fLock);
 	return E_NOTIMPL;
 }
 static ICOM_VTABLE(IClassFactory) slcfvt = 
@@ -424,7 +424,7 @@
 
 	sl->lppf = IPersistFile_Constructor();
 
-	TRACE(shell,"(%p)->()\n",sl);
+	TRACE("(%p)->()\n",sl);
 	shell32_ObjCount++;
 	return (IShellLink *)sl;
 }
@@ -438,7 +438,7 @@
 	
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
+	TRACE("(%p)->(\n\tIID:\t%s)\n",This,xriid);
 
 	*ppvObj = NULL;
 
@@ -454,10 +454,10 @@
 
 	if(*ppvObj)
 	{ IShellLink_AddRef((IShellLink*)*ppvObj);      
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }  
 /******************************************************************************
@@ -467,7 +467,7 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -479,11 +479,11 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IShellLink(%p)\n",This);
+	{ TRACE("-- destroying IShellLink(%p)\n",This);
 	  IPersistFile_Release((IPersistFile*) This->lppf);	/* IPersistFile*/
 	  HeapFree(GetProcessHeap(),0,This);
 	  return 0;
@@ -495,7 +495,7 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	TRACE(shell,"(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",This, pszFile, cchMaxPath, pfd, fFlags);
+	TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",This, pszFile, cchMaxPath, pfd, fFlags);
 
 	strncpy(pszFile,This->lppf->sPath, cchMaxPath);
 	return NOERROR;
@@ -504,7 +504,7 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	TRACE(shell,"(%p)->(ppidl=%p)\n",This, ppidl);
+	TRACE("(%p)->(ppidl=%p)\n",This, ppidl);
 
 	*ppidl = ILClone(This->lppf->pPidl);
 	return NOERROR;
@@ -513,7 +513,7 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	TRACE (shell,"(%p)->(pidl=%p)\n",This, pidl);
+	TRACE("(%p)->(pidl=%p)\n",This, pidl);
 
 	if (This->lppf->pPidl)
 	    SHFree(This->lppf->pPidl);
@@ -524,7 +524,7 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p len=%u)\n",This, pszName, cchMaxName);
+	FIXME("(%p)->(%p len=%u)\n",This, pszName, cchMaxName);
 	strncpy(pszName,"Description, FIXME",cchMaxName);
 	return NOERROR;
 }
@@ -532,14 +532,14 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(desc=%s)\n",This, pszName);
+	FIXME("(%p)->(desc=%s)\n",This, pszName);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnGetWorkingDirectory(IShellLink * iface, LPSTR pszDir,INT cchMaxPath)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->()\n",This);
+	FIXME("(%p)->()\n",This);
 	strncpy(pszDir,"c:\\", cchMaxPath);
 	return NOERROR;
 }
@@ -547,14 +547,14 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(dir=%s)\n",This, pszDir);
+	FIXME("(%p)->(dir=%s)\n",This, pszDir);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnGetArguments(IShellLink * iface, LPSTR pszArgs,INT cchMaxPath)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p len=%u)\n",This, pszArgs, cchMaxPath);
+	FIXME("(%p)->(%p len=%u)\n",This, pszArgs, cchMaxPath);
 	strncpy(pszArgs, "", cchMaxPath);
 	return NOERROR;
 }
@@ -562,14 +562,14 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(args=%s)\n",This, pszArgs);
+	FIXME("(%p)->(args=%s)\n",This, pszArgs);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnGetHotkey(IShellLink * iface, WORD *pwHotkey)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p) returning 0\n",This, pwHotkey);
+	FIXME("(%p)->(%p) returning 0\n",This, pwHotkey);
 	*pwHotkey=0x0;
 	return NOERROR;
 }
@@ -577,14 +577,14 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(hotkey=%x)\n",This, wHotkey);
+	FIXME("(%p)->(hotkey=%x)\n",This, wHotkey);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnGetShowCmd(IShellLink * iface, INT *piShowCmd)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p)\n",This, piShowCmd);
+	FIXME("(%p)->(%p)\n",This, piShowCmd);
 	*piShowCmd=0;
 	return NOERROR;
 }
@@ -592,14 +592,14 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(showcmd=%x)\n",This, iShowCmd);
+	FIXME("(%p)->(showcmd=%x)\n",This, iShowCmd);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnGetIconLocation(IShellLink * iface, LPSTR pszIconPath,INT cchIconPath,INT *piIcon)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",This, pszIconPath, cchIconPath, piIcon);
+	FIXME("(%p)->(%p len=%u iicon=%p)\n",This, pszIconPath, cchIconPath, piIcon);
 	strncpy(pszIconPath,"shell32.dll",cchIconPath);
 	*piIcon=1;
 	return NOERROR;
@@ -608,28 +608,28 @@
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(path=%s iicon=%u)\n",This, pszIconPath, iIcon);
+	FIXME("(%p)->(path=%s iicon=%u)\n",This, pszIconPath, iIcon);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnSetRelativePath(IShellLink * iface, LPCSTR pszPathRel, DWORD dwReserved)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(path=%s %lx)\n",This, pszPathRel, dwReserved);
+	FIXME("(%p)->(path=%s %lx)\n",This, pszPathRel, dwReserved);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnResolve(IShellLink * iface, HWND hwnd, DWORD fFlags)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",This, hwnd, fFlags);
+	FIXME("(%p)->(hwnd=%x flags=%lx)\n",This, hwnd, fFlags);
 	return NOERROR;
 }
 static HRESULT WINAPI IShellLink_fnSetPath(IShellLink * iface, LPCSTR pszFile)
 {
 	ICOM_THIS(IShellLinkImpl, iface);
 	
-	FIXME(shell,"(%p)->(path=%s)\n",This, pszFile);
+	FIXME("(%p)->(path=%s)\n",This, pszFile);
 	return NOERROR;
 }
 
@@ -680,7 +680,7 @@
 	lpclf= (IClassFactoryImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactoryImpl));
 	lpclf->ref = 1;
 	lpclf->lpvtbl = &slwcfvt;
-	TRACE(shell,"(%p)->()\n",lpclf);
+	TRACE("(%p)->()\n",lpclf);
 	shell32_ObjCount++;
 	return (LPCLASSFACTORY)lpclf;
 }
@@ -693,7 +693,7 @@
 	ICOM_THIS(IClassFactoryImpl,iface);
 	char	xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
+	TRACE("(%p)->(\n\tIID:\t%s)\n",This,xriid);
 
 	*ppvObj = NULL;
 
@@ -706,10 +706,10 @@
 
 	if(*ppvObj) {
 	  IUnknown_AddRef((IUnknown*)*ppvObj);  	
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }  
 /******************************************************************************
@@ -718,7 +718,7 @@
 static ULONG WINAPI IShellLinkW_CF_AddRef(LPCLASSFACTORY iface)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -729,11 +729,11 @@
 static ULONG WINAPI IShellLinkW_CF_Release(LPCLASSFACTORY iface)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IClassFactory(%p)\n",This);
+	{ TRACE("-- destroying IClassFactory(%p)\n",This);
 		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
@@ -751,7 +751,7 @@
 	char	xriid[50];
 
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,xriid,ppObject);
+	TRACE("%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,xriid,ppObject);
 
 	*ppObject = NULL;
 		
@@ -763,7 +763,7 @@
 	{ pObj = (IUnknown *)IShellLinkW_Constructor();
 	} 
 	else
-	{ ERR(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);
+	{ ERR("unknown IID requested\n\tIID:\t%s\n",xriid);
 	  return(E_NOINTERFACE);
 	}
 	
@@ -773,7 +773,7 @@
 	 
 	hres = pObj->lpvtbl->fnQueryInterface(pObj,riid, ppObject);
 	pObj->lpvtbl->fnRelease(pObj);
-	TRACE(shell,"-- Object created: (%p)->%p\n",This,*ppObject);
+	TRACE("-- Object created: (%p)->%p\n",This,*ppObject);
 
 	return hres;
 }
@@ -784,7 +784,7 @@
 static HRESULT WINAPI IShellLinkW_CF_LockServer(LPCLASSFACTORY iface, BOOL fLock)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"%p->(0x%x), not implemented\n",This, fLock);
+	TRACE("%p->(0x%x), not implemented\n",This, fLock);
 	return E_NOTIMPL;
 }
 
@@ -825,7 +825,7 @@
 
 	sl->lppf = IPersistFile_Constructor();
 
-	TRACE(shell,"(%p)->()\n",sl);
+	TRACE("(%p)->()\n",sl);
 	shell32_ObjCount++;
 	return (IShellLinkW*)sl;
 }
@@ -840,7 +840,7 @@
 	
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
+	TRACE("(%p)->(\n\tIID:\t%s)\n",This,xriid);
 
 	*ppvObj = NULL;
 
@@ -856,11 +856,11 @@
 
 	if(*ppvObj)
 	{ IShellLink_AddRef((IShellLinkW*)*ppvObj);      
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
 
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 
 	return E_NOINTERFACE;
 }  
@@ -871,7 +871,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -884,11 +884,11 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IShellLinkW(%p)\n",This);
+	{ TRACE("-- destroying IShellLinkW(%p)\n",This);
 	  IPersistFile_Release((IPersistFile*)This->lppf);	/* IPersistFile*/
 	  HeapFree(GetProcessHeap(),0,This);
 	  return 0;
@@ -900,7 +900,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",This, pszFile, cchMaxPath, pfd, fFlags);
+	FIXME("(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",This, pszFile, cchMaxPath, pfd, fFlags);
 	lstrcpynAtoW(pszFile,"c:\\foo.bar", cchMaxPath);
 	return NOERROR;
 }
@@ -909,7 +909,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(ppidl=%p)\n",This, ppidl);
+	FIXME("(%p)->(ppidl=%p)\n",This, ppidl);
 	*ppidl = _ILCreateDesktop();
 	return NOERROR;
 }
@@ -918,7 +918,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(pidl=%p)\n",This, pidl);
+	FIXME("(%p)->(pidl=%p)\n",This, pidl);
 	return NOERROR;
 }
 
@@ -926,7 +926,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p len=%u)\n",This, pszName, cchMaxName);
+	FIXME("(%p)->(%p len=%u)\n",This, pszName, cchMaxName);
 	lstrcpynAtoW(pszName,"Description, FIXME",cchMaxName);
 	return NOERROR;
 }
@@ -935,7 +935,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(desc=%s)\n",This, debugstr_w(pszName));
+	FIXME("(%p)->(desc=%s)\n",This, debugstr_w(pszName));
 	return NOERROR;
 }
 
@@ -943,7 +943,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->()\n",This);
+	FIXME("(%p)->()\n",This);
 	lstrcpynAtoW(pszDir,"c:\\", cchMaxPath);
 	return NOERROR;
 }
@@ -952,7 +952,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(dir=%s)\n",This, debugstr_w(pszDir));
+	FIXME("(%p)->(dir=%s)\n",This, debugstr_w(pszDir));
 	return NOERROR;
 }
 
@@ -960,7 +960,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p len=%u)\n",This, pszArgs, cchMaxPath);
+	FIXME("(%p)->(%p len=%u)\n",This, pszArgs, cchMaxPath);
 	lstrcpynAtoW(pszArgs, "", cchMaxPath);
 	return NOERROR;
 }
@@ -969,7 +969,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(args=%s)\n",This, debugstr_w(pszArgs));
+	FIXME("(%p)->(args=%s)\n",This, debugstr_w(pszArgs));
 	return NOERROR;
 }
 
@@ -977,7 +977,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p)\n",This, pwHotkey);
+	FIXME("(%p)->(%p)\n",This, pwHotkey);
 	*pwHotkey=0x0;
 	return NOERROR;
 }
@@ -986,7 +986,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(hotkey=%x)\n",This, wHotkey);
+	FIXME("(%p)->(hotkey=%x)\n",This, wHotkey);
 	return NOERROR;
 }
 
@@ -994,7 +994,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p)\n",This, piShowCmd);
+	FIXME("(%p)->(%p)\n",This, piShowCmd);
 	*piShowCmd=0;
 	return NOERROR;
 }
@@ -1003,7 +1003,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(showcmd=%x)\n",This, iShowCmd);
+	FIXME("(%p)->(showcmd=%x)\n",This, iShowCmd);
 	return NOERROR;
 }
 
@@ -1011,7 +1011,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",This, pszIconPath, cchIconPath, piIcon);
+	FIXME("(%p)->(%p len=%u iicon=%p)\n",This, pszIconPath, cchIconPath, piIcon);
 	lstrcpynAtoW(pszIconPath,"shell32.dll",cchIconPath);
 	*piIcon=1;
 	return NOERROR;
@@ -1021,7 +1021,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(path=%s iicon=%u)\n",This, debugstr_w(pszIconPath), iIcon);
+	FIXME("(%p)->(path=%s iicon=%u)\n",This, debugstr_w(pszIconPath), iIcon);
 	return NOERROR;
 }
 
@@ -1029,7 +1029,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(path=%s %lx)\n",This, debugstr_w(pszPathRel), dwReserved);
+	FIXME("(%p)->(path=%s %lx)\n",This, debugstr_w(pszPathRel), dwReserved);
 	return NOERROR;
 }
 
@@ -1037,7 +1037,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",This, hwnd, fFlags);
+	FIXME("(%p)->(hwnd=%x flags=%lx)\n",This, hwnd, fFlags);
 	return NOERROR;
 }
 
@@ -1045,7 +1045,7 @@
 {
 	ICOM_THIS(IShellLinkWImpl, iface);
 	
-	FIXME(shell,"(%p)->(path=%s)\n",This, debugstr_w(pszFile));
+	FIXME("(%p)->(path=%s)\n",This, debugstr_w(pszFile));
 	return NOERROR;
 }
 
diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c
index ec67460..765a5ab 100644
--- a/dlls/shell32/shellole.c
+++ b/dlls/shell32/shellole.c
@@ -21,7 +21,7 @@
 #include "winversion.h"
 #include "winreg.h"
 #include "winerror.h"
-#include "debug.h"
+#include "debugtools.h"
 
 #include "shell32_main.h"
 
@@ -36,7 +36,7 @@
 {	HMODULE hmod;
 	FARPROC dllunload,nameproc;
 
-	TRACE(shell,"dll=%s, hmodule=%p, name=%s\n",dllname, xhmod, name);
+	TRACE("dll=%s, hmodule=%p, name=%s\n",dllname, xhmod, name);
 	if (xhmod)
 	{ *xhmod = 0;
 	}
@@ -73,7 +73,7 @@
 	char	xclsid[50],xrefiid[50];
 	WINE_StringFromCLSID((LPCLSID)clsid,xclsid);
 	WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
-	TRACE(shell,"\n\tCLSID:%s,%s,%p,\n\tIID:%s,%p\n",xclsid, dllname,unknownouter,xrefiid,inst);
+	TRACE("\n\tCLSID:%s,%s,%p,\n\tIID:%s,%p\n",xclsid, dllname,unknownouter,xrefiid,inst);
 	
 	dllgetclassob = SH_find_moduleproc(dllname,NULL,"DllGetClassObject");
 	if (!dllgetclassob)
@@ -84,7 +84,7 @@
 	if ((hres<0) || (hres>=0x80000000))
 	    return hres;
 	if (!classfac)
-	{ FIXME(shell,"no classfactory, but hres is 0x%ld!\n",hres);
+	{ FIXME("no classfactory, but hres is 0x%ld!\n",hres);
 	  return E_FAIL;
 	}
 	IClassFactory_CreateInstance(classfac,unknownouter,refiid,inst);
@@ -115,7 +115,7 @@
 	  }
 	  strcpy(xclsid,aclsid);
 	}
-	TRACE(shell,"(%p,\n\tSID:\t%s,%p,\n\tIID:\t%s,%p)\n",aclsid,xclsid,unknownouter,xiid,inst);
+	TRACE("(%p,\n\tSID:\t%s,%p,\n\tIID:\t%s,%p)\n",aclsid,xclsid,unknownouter,xiid,inst);
 
 	sprintf(buffer,"CLSID\\%s\\InProcServer32",xclsid);
 
@@ -129,7 +129,7 @@
 	  return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
 	}
 
-	TRACE(shell, "Server dll is %s\n",path);
+	TRACE("Server dll is %s\n",path);
 	tmodellen=sizeof(tmodel);
 	type=REG_SZ;
 	if (RegQueryValueExA(inprockey,"ThreadingModel",NULL,&type,tmodel,&tmodellen))
@@ -137,7 +137,7 @@
 	  return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
 	}
 
-	TRACE(shell, "Threading model is %s\n",tmodel);
+	TRACE("Threading model is %s\n",tmodel);
 
 	hres=SH_get_instance(clsid,path,unknownouter,refiid,inst);
 	if (hres<0 || (hres>0x80000000))
@@ -166,13 +166,13 @@
 	char xclsid[50],xiid[50];
 	WINE_StringFromCLSID((LPCLSID)rclsid,xclsid);
 	WINE_StringFromCLSID((LPCLSID)iid,xiid);
-	TRACE(shell,"\n\tCLSID:\t%s,\n\tIID:\t%s\n",xclsid,xiid);
+	TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n",xclsid,xiid);
 	
 	*ppv = NULL;
 	if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop)|| 
 	   IsEqualCLSID(rclsid, &CLSID_ShellLink))
 	{ if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop))      /*debug*/
-	  { TRACE(shell,"-- requested CLSID_ShellDesktop\n");
+	  { TRACE("-- requested CLSID_ShellDesktop\n");
 	  }
 
 	  if (IsEqualCLSID(rclsid, &CLSID_ShellLink))
@@ -191,10 +191,10 @@
 	  }
 	}
 	else
-	{ WARN(shell, "-- CLSID not found\n");
+	{ WARN("-- CLSID not found\n");
 	  hres = CLASS_E_CLASSNOTAVAILABLE;
 	}
-	TRACE(shell,"-- pointer to class factory: %p\n",*ppv);
+	TRACE("-- pointer to class factory: %p\n",*ppv);
 	return hres;
 }
 
@@ -206,7 +206,7 @@
  */
 DWORD WINAPI SHCLSIDFromString (LPSTR clsid, CLSID *id)
 {
-	TRACE (shell,"(%p(%s) %p)\n", clsid, clsid, id);
+	TRACE("(%p(%s) %p)\n", clsid, clsid, id);
 	return CLSIDFromString16(clsid, id); 
 }
 
@@ -221,7 +221,7 @@
  * heap (ProcessHeap).
  */
 DWORD WINAPI SHGetMalloc(LPMALLOC *lpmal) 
-{	TRACE(shell,"(%p)\n", lpmal);
+{	TRACE("(%p)\n", lpmal);
 	return CoGetMalloc(0,lpmal);
 }
 
@@ -250,7 +250,7 @@
 	lpclf->ref = 1;
 	lpclf->lpvtbl = &clfvt;
 
-	TRACE(shell,"(%p)->()\n",lpclf);
+	TRACE("(%p)->()\n",lpclf);
 	shell32_ObjCount++;
 	return (LPCLASSFACTORY)lpclf;
 }
@@ -263,7 +263,7 @@
 	ICOM_THIS(IClassFactoryImpl,iface);
 	char	xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
+	TRACE("(%p)->(\n\tIID:\t%s)\n",This,xriid);
 
 	*ppvObj = NULL;
 
@@ -276,10 +276,10 @@
 
 	if(*ppvObj)
 	{ IUnknown_AddRef((LPUNKNOWN)*ppvObj);  	
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }  
 /******************************************************************************
@@ -288,7 +288,7 @@
 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -299,11 +299,11 @@
 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IClassFactory(%p)\n",This);
+	{ TRACE("-- destroying IClassFactory(%p)\n",This);
 		HeapFree(GetProcessHeap(),0,This);
 		return 0;
 	}
@@ -321,7 +321,7 @@
 	char	xriid[50];
 
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,xriid,ppObject);
+	TRACE("%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,xriid,ppObject);
 
 	*ppObject = NULL;
 		
@@ -345,7 +345,7 @@
 	{ pObj = (IUnknown *)IDataObject_Constructor(0,NULL,NULL,0);
 	} 
 	else
-	{ ERR(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);
+	{ ERR("unknown IID requested\n\tIID:\t%s\n",xriid);
 	  return(E_NOINTERFACE);
 	}
 	
@@ -355,7 +355,7 @@
 	 
 	hres = pObj->lpvtbl->fnQueryInterface(pObj,riid, ppObject);
 	pObj->lpvtbl->fnRelease(pObj);
-	TRACE(shell,"-- Object created: (%p)->%p\n",This,*ppObject);
+	TRACE("-- Object created: (%p)->%p\n",This,*ppObject);
 
 	return hres;
 }
@@ -365,7 +365,7 @@
 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface, BOOL fLock)
 {
 	ICOM_THIS(IClassFactoryImpl,iface);
-	TRACE(shell,"%p->(0x%x), not implemented\n",This, fLock);
+	TRACE("%p->(0x%x), not implemented\n",This, fLock);
 	return E_NOTIMPL;
 }
 
diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c
index 64e6d4f..2207056 100644
--- a/dlls/shell32/shellord.c
+++ b/dlls/shell32/shellord.c
@@ -8,7 +8,7 @@
 #include <string.h>
 #include "winerror.h"
 #include "winreg.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winnls.h"
 #include "winversion.h"
 #include "heap.h"
@@ -34,7 +34,7 @@
     DWORD msg,
     int count,
     IDSTRUCT *idlist)
-{	FIXME(shell,"(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):stub.\n",
+{	FIXME("(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):stub.\n",
 		hwnd,events1,events2,msg,count,idlist);
 	return 0;
 }
@@ -43,7 +43,7 @@
  */
 DWORD WINAPI
 SHChangeNotifyDeregister(LONG x1)
-{	FIXME(shell,"(0x%08lx):stub.\n",x1);
+{	FIXME("(0x%08lx):stub.\n",x1);
 	return 0;
 }
 /*************************************************************************
@@ -59,7 +59,7 @@
     DWORD msg,
     int count,
     IDSTRUCT *idlist)
-{	FIXME(shell,"(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):stub.\n",
+{	FIXME("(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):stub.\n",
 		hwnd,events1,events2,msg,count,idlist);
 	return 0;
 }
@@ -67,7 +67,7 @@
  * NTSHChangeNotifyDeregister			[SHELL32.641]
  */
 DWORD WINAPI NTSHChangeNotifyDeregister(LONG x1)
-{	FIXME(shell,"(0x%08lx):stub.\n",x1);
+{	FIXME("(0x%08lx):stub.\n",x1);
 	return 0;
 }
 
@@ -76,7 +76,7 @@
  *
  */
 DWORD WINAPI ParseFieldA(LPCSTR src, DWORD field, LPSTR dst, DWORD len) 
-{	WARN(shell,"('%s',0x%08lx,%p,%ld) semi-stub.\n",src,field,dst,len);
+{	WARN("('%s',0x%08lx,%p,%ld) semi-stub.\n",src,field,dst,len);
 
 	if (!src || !src[0] || !dst || !len)
 	  return 0;
@@ -103,7 +103,7 @@
  * 
  */
 DWORD WINAPI PickIconDlg(DWORD x,DWORD y,DWORD z,DWORD a) 
-{	FIXME(shell,"(%08lx,%08lx,%08lx,%08lx):stub.\n",x,y,z,a);
+{	FIXME("(%08lx,%08lx,%08lx,%08lx):stub.\n",x,y,z,a);
 	return 0xffffffff;
 }
 
@@ -112,7 +112,7 @@
  * 
  */
 DWORD WINAPI GetFileNameFromBrowse(HWND howner, LPSTR targetbuf, DWORD len, DWORD x, LPCSTR suffix, LPCSTR y, LPCSTR cmd) 
-{	FIXME(shell,"(%04x,%p,%ld,%08lx,%s,%s,%s):stub.\n",
+{	FIXME("(%04x,%p,%ld,%08lx,%s,%s,%s):stub.\n",
 	    howner,targetbuf,len,x,suffix,y,cmd);
     /* puts up a Open Dialog and requests input into targetbuf */
     /* OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST|OFN_unknown */
@@ -133,7 +133,7 @@
 	DWORD	dwData;
 	DWORD	dwDataSize = sizeof (DWORD);
 
-	TRACE(shell,"(%p 0x%08lx 0x%08lx)\n",lpsfs,dwMask, dwx);
+	TRACE("(%p 0x%08lx 0x%08lx)\n",lpsfs,dwMask, dwx);
 	
 	if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
 				 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0))
@@ -173,7 +173,7 @@
 	}
 	RegCloseKey (hKey);
 
-	TRACE(shell,"-- 0x%04x\n", *(WORD*)lpsfs);
+	TRACE("-- 0x%04x\n", *(WORD*)lpsfs);
 }
 
 /*************************************************************************
@@ -192,7 +192,7 @@
  *    that was clicked.
  */
 int WINAPI SHShellFolderView_Message(HWND hwndCabinet,UINT uMsg,LPARAM lParam)
-{ FIXME(shell,"%04x %08ux %08lx stub\n",hwndCabinet,uMsg,lParam);
+{ FIXME("%04x %08ux %08lx stub\n",hwndCabinet,uMsg,lParam);
   return 0;
 }
 
@@ -201,7 +201,7 @@
  */
 BOOL WINAPI OleStrToStrN (LPSTR lpMulti, INT nMulti, LPCWSTR lpWide, INT nWide) 
 {
-	TRACE(shell,"%s %x %s %x\n", lpMulti, nMulti, debugstr_w(lpWide), nWide);
+	TRACE("%s %x %s %x\n", lpMulti, nMulti, debugstr_w(lpWide), nWide);
 	return WideCharToMultiByte (0, 0, lpWide, nWide, lpMulti, nMulti, NULL, NULL);
 }
 
@@ -210,7 +210,7 @@
  */
 BOOL WINAPI StrToOleStrN (LPWSTR lpWide, INT nWide, LPCSTR lpMulti, INT nMulti) 
 {
-	TRACE(shell,"%s %x %s %x\n", debugstr_w(lpWide), nWide, lpMulti, nMulti);
+	TRACE("%s %x %s %x\n", debugstr_w(lpWide), nWide, lpMulti, nMulti);
 	return MultiByteToWideChar (0, 0, lpMulti, nMulti, lpWide, nWide);
 }
 
@@ -225,7 +225,7 @@
  *     exported by ordinal
  */
 void WINAPI RegisterShellHook(HWND hwnd, DWORD y) {
-    FIXME(shell,"(0x%08x,0x%08lx):stub.\n",hwnd,y);
+    FIXME("(0x%08x,0x%08lx):stub.\n",hwnd,y);
 }
 /*************************************************************************
  * ShellMessageBoxW				[SHELL32.182]
@@ -244,7 +244,7 @@
 	LPWSTR   pszText = &szText[0], pszTitle = &szTitle[0];
 	LPVOID	args = &arglist;
 
-	TRACE(shell,"(%08lx,%08lx,%08lx,%08lx,%08lx,%p)\n",(DWORD)hmod,(DWORD)hwnd,idText,idTitle,uType,arglist);
+	TRACE("(%08lx,%08lx,%08lx,%08lx,%08lx,%p)\n",(DWORD)hmod,(DWORD)hwnd,idText,idTitle,uType,arglist);
 
 	if (!HIWORD (idTitle))
 	  LoadStringW(hmod,idTitle,pszTitle,100);
@@ -269,7 +269,7 @@
 	LPSTR   pszText = &szText[0], pszTitle = &szTitle[0];
 	LPVOID	args = &arglist;
 
-	TRACE(shell,"(%08lx,%08lx,%08lx,%08lx,%08lx,%p)\n", (DWORD)hmod,(DWORD)hwnd,idText,idTitle,uType,arglist);
+	TRACE("(%08lx,%08lx,%08lx,%08lx,%08lx,%p)\n", (DWORD)hmod,(DWORD)hwnd,idText,idTitle,uType,arglist);
 
 	if (!HIWORD (idTitle))
 	  LoadStringA(hmod,idTitle,pszTitle,100);
@@ -317,7 +317,7 @@
 DWORD WINAPI SHRestricted (DWORD pol) {
 	HKEY	xhkey;
 
-	FIXME(shell,"(%08lx):stub.\n",pol);
+	FIXME("(%08lx):stub.\n",pol);
 	if (RegOpenKeyA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies",&xhkey))
 		return 0;
 	/* FIXME: do nothing for now, just return 0 (== "allowed") */
@@ -333,7 +333,7 @@
  *  not sure about LPSECURITY_ATTRIBUTES
  */
 DWORD WINAPI SHCreateDirectory(LPSECURITY_ATTRIBUTES sec,LPCSTR path) {
-	TRACE(shell,"(%p,%s):stub.\n",sec,path);
+	TRACE("(%p,%s):stub.\n",sec,path);
 	if (CreateDirectoryA(path,sec))
 		return TRUE;
 	/* SHChangeNotify(8,1,path,0); */
@@ -341,7 +341,7 @@
 #if 0
 	if (SHELL32_79(path,(LPVOID)x))
 		return 0;
-	FIXME(shell,"(%08lx,%s):stub.\n",x,path);
+	FIXME("(%08lx,%s):stub.\n",x,path);
 	return 0;
 #endif
 }
@@ -354,7 +354,7 @@
  *     exported by ordinal
  */
 DWORD WINAPI SHFree(LPVOID x) {
-  TRACE(shell,"%p\n",x);
+  TRACE("%p\n",x);
   if (!HIWORD(x))
   { *(LPDWORD)0xdeaf0000 = 0;
   }
@@ -371,7 +371,7 @@
 LPVOID WINAPI SHAlloc(DWORD len) {
  /* void * ret = (LPVOID)LocalAlloc32(len,LMEM_ZEROINIT);*/ /* chrashes */
  void * ret = (LPVOID) HeapAlloc(GetProcessHeap(),0,len);
-  TRACE(shell,"%lu bytes at %p\n",len, ret);
+  TRACE("%lu bytes at %p\n",len, ret);
   return ret;
 }
 
@@ -383,7 +383,7 @@
  */
 DWORD WINAPI SHRegisterDragDrop(HWND hWnd,IDropTarget * pDropTarget) 
 {
-	FIXME (shell, "(0x%08x,%p):stub.\n", hWnd, pDropTarget);
+	FIXME("(0x%08x,%p):stub.\n", hWnd, pDropTarget);
 	return     RegisterDragDrop(hWnd, pDropTarget);
 }
 
@@ -394,7 +394,7 @@
  *     exported by ordinal
  */
 DWORD WINAPI SHRevokeDragDrop(DWORD x) {
-    FIXME(shell,"(0x%08lx):stub.\n",x);
+    FIXME("(0x%08lx):stub.\n",x);
     return 0;
 }
 
@@ -408,7 +408,7 @@
 RunFileDlg (HWND hwndOwner, DWORD dwParam1, DWORD dwParam2,
 	    LPSTR lpszTitle, LPSTR lpszPrompt, UINT uFlags)
 {
-    FIXME (shell,"(0x%08x 0x%lx 0x%lx \"%s\" \"%s\" 0x%x):stub.\n",
+    FIXME("(0x%08x 0x%lx 0x%lx \"%s\" \"%s\" 0x%x):stub.\n",
 	   hwndOwner, dwParam1, dwParam2, lpszTitle, lpszPrompt, uFlags);
     return 0;
 }
@@ -421,7 +421,7 @@
  */
 void WINAPI ExitWindowsDialog (HWND hWndOwner)
 {
-	TRACE (shell,"(0x%08x)\n", hWndOwner);
+	TRACE("(0x%08x)\n", hWndOwner);
 	if (MessageBoxA( hWndOwner, "Do you want to exit WINE?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDOK)
 	{ SendMessageA ( hWndOwner, WM_QUIT, 0, 0);
 	}
@@ -435,7 +435,7 @@
 ArrangeWindows (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3,
 		DWORD dwParam4, DWORD dwParam5)
 {
-    FIXME (shell,"(0x%lx 0x%lx 0x%lx 0x%lx 0x%lx):stub.\n",
+    FIXME("(0x%lx 0x%lx 0x%lx 0x%lx 0x%lx):stub.\n",
 	   dwParam1, dwParam2, dwParam3, dwParam4, dwParam5);
     return 0;
 }
@@ -449,7 +449,7 @@
 DWORD WINAPI
 SignalFileOpen (DWORD dwParam1)
 {
-    FIXME (shell,"(0x%08lx):stub.\n", dwParam1);
+    FIXME("(0x%08lx):stub.\n", dwParam1);
 
     return 0;
 }
@@ -466,10 +466,10 @@
  */
 DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv)   
 { if (SHARD_PIDL==uFlags)
-  { FIXME (shell,"(0x%08x,pidl=%p):stub.\n", uFlags,pv);
+  { FIXME("(0x%08x,pidl=%p):stub.\n", uFlags,pv);
 	}
 	else
-	{ FIXME (shell,"(0x%08x,%s):stub.\n", uFlags,(char*)pv);
+	{ FIXME("(0x%08x,%s):stub.\n", uFlags,(char*)pv);
 	}
   return 0;
 }
@@ -478,7 +478,7 @@
  *
  */
 DWORD WINAPI SHFileOperationAW(DWORD x)
-{	FIXME(shell,"0x%08lx stub\n",x);
+{	FIXME("0x%08lx stub\n",x);
 	return 0;
 
 }
@@ -490,7 +490,7 @@
  *     exported by name
  */
 DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp)   
-{ FIXME (shell,"(%p):stub.\n", lpFileOp);
+{ FIXME("(%p):stub.\n", lpFileOp);
   return 1;
 }
 /*************************************************************************
@@ -500,7 +500,7 @@
  *     exported by name
  */
 DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp)   
-{ FIXME (shell,"(%p):stub.\n", lpFileOp);
+{ FIXME("(%p):stub.\n", lpFileOp);
   return 1;
 }
 
@@ -515,7 +515,7 @@
     UINT  uFlags,   /* [IN] the meaning of dwItem[1|2]*/
 		LPCVOID dwItem1,
 		LPCVOID dwItem2)
-{ FIXME (shell,"(0x%08x,0x%08ux,%p,%p):stub.\n", wEventId,uFlags,dwItem1,dwItem2);
+{ FIXME("(0x%08x,0x%08ux,%p,%p):stub.\n", wEventId,uFlags,dwItem1,dwItem2);
   return 0;
 }
 /*************************************************************************
@@ -527,7 +527,7 @@
 HRESULT WINAPI SHCreateShellFolderViewEx(
   LPSHELLVIEWDATA psvcbi, /*[in ] shelltemplate struct*/
   LPVOID* ppv)            /*[out] IShellView pointer*/
-{ FIXME (shell,"(%p,%p):stub.\n", psvcbi,ppv);
+{ FIXME("(%p,%p):stub.\n", psvcbi,ppv);
   return 0;
 }
 /*************************************************************************
@@ -535,7 +535,7 @@
  *
  */
 HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z)
-{	FIXME(shell,"0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z);
+{	FIXME("0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z);
 	return 0;
 }
 /*************************************************************************
@@ -543,7 +543,7 @@
  *
  */
 HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z)
-{	FIXME(shell,"0x%08lx 0x%08lx stub\n",x,z);
+{	FIXME("0x%08lx 0x%08lx stub\n",x,z);
 	return 0;
 }
 /*************************************************************************
@@ -566,7 +566,7 @@
 	STARTUPINFOA  startupinfo;
 	PROCESS_INFORMATION processinformation;
 			
-  	WARN(shell,"mask=0x%08lx hwnd=0x%04x verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s incomplete\n",
+  	WARN("mask=0x%08lx hwnd=0x%04x verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s incomplete\n",
 		sei->fMask, sei->hwnd, sei->lpVerb, sei->lpFile,
 		sei->lpParameters, sei->lpDirectory, sei->nShow, sei->lpClass);
 
@@ -582,7 +582,7 @@
 			  SEE_MASK_NOCLOSEPROCESS | SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT |
 			  SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI | SEE_MASK_UNICODE | 
 			  SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR ))
-	{ FIXME (shell,"flags ignored: 0x%08lx\n", sei->fMask);
+	{ FIXME("flags ignored: 0x%08lx\n", sei->fMask);
 	}
 
 	if (sei->fMask & SEE_MASK_CLASSNAME)
@@ -592,7 +592,7 @@
 	/* process the IDList */
 	if ( (sei->fMask & SEE_MASK_INVOKEIDLIST) == SEE_MASK_INVOKEIDLIST) /*0x0c*/
 	{ SHGetPathFromIDListA (sei->lpIDList,szApplicationName);
-	  TRACE(shell,"-- idlist=%p (%s)\n", sei->lpIDList, szApplicationName);
+	  TRACE("-- idlist=%p (%s)\n", sei->lpIDList, szApplicationName);
 	}
 	else
 	{ if (sei->fMask & SEE_MASK_IDLIST )
@@ -619,7 +619,7 @@
 	  memmove(pos,pos+3,len);
 	}
 
-	TRACE(shell,"execute: %s %s\n",szApplicationName, szCommandline);
+	TRACE("execute: %s %s\n",szApplicationName, szCommandline);
 
 	ZeroMemory(&startupinfo,sizeof(STARTUPINFOA));
 	startupinfo.cb = sizeof(STARTUPINFOA);
@@ -639,7 +639,7 @@
 {	SHELLEXECUTEINFOA seiA;
 	DWORD ret;
 
-	TRACE (shell,"%p\n", sei);
+	TRACE("%p\n", sei);
 
 	memcpy(&seiA, sei, sizeof(SHELLEXECUTEINFOA));
 	
@@ -679,7 +679,7 @@
  *  Sets the interface
  */
 HRESULT WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown)
-{	TRACE (shell,"%p\n", lpUnknown);
+{	TRACE("%p\n", lpUnknown);
 	SHELL32_IExplorerInterface = lpUnknown;
 	return (HRESULT) lpUnknown;
 }
@@ -690,7 +690,7 @@
  *  gets the interface pointer of the explorer and a reference
  */
 HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown)
-{	TRACE(shell,"%p\n", lpUnknown);
+{	TRACE("%p\n", lpUnknown);
 
 	*lpUnknown = SHELL32_IExplorerInterface;
 
@@ -707,7 +707,7 @@
  *  exported by name
  */
 HRESULT WINAPI SHFreeUnusedLibraries (void)
-{	FIXME(shell,"stub\n");
+{	FIXME("stub\n");
 	return TRUE;
 }
 /*************************************************************************
@@ -717,7 +717,7 @@
  *  exported by name
  */
 HRESULT WINAPI DAD_ShowDragImage (DWORD u)
-{ FIXME(shell,"0x%08lx stub\n",u);
+{ FIXME("0x%08lx stub\n",u);
   return 0;
 }
 /*************************************************************************
@@ -725,7 +725,7 @@
  *
  */
 HRESULT WINAPI SHRegCloseKey (HKEY hkey)
-{	TRACE(shell,"0x%04x\n",hkey);
+{	TRACE("0x%04x\n",hkey);
 	return RegCloseKey( hkey );
 }
 /*************************************************************************
@@ -733,7 +733,7 @@
  *
  */
 HRESULT WINAPI SHRegOpenKeyA(HKEY hKey, LPSTR lpSubKey, LPHKEY phkResult)
-{	FIXME(shell,"(0x%08x, %s, %p)\n", hKey, debugstr_a(lpSubKey),
+{	FIXME("(0x%08x, %s, %p)\n", hKey, debugstr_a(lpSubKey),
 	      phkResult);
 	return RegOpenKeyA(hKey, lpSubKey, phkResult);
 }
@@ -743,7 +743,7 @@
  *
  */
 HRESULT WINAPI SHRegOpenKeyW (HKEY hkey, LPCWSTR lpszSubKey, LPHKEY retkey)
-{	WARN(shell,"0x%04x %s %p\n",hkey,debugstr_w(lpszSubKey),retkey);
+{	WARN("0x%04x %s %p\n",hkey,debugstr_w(lpszSubKey),retkey);
 	return RegOpenKeyW( hkey, lpszSubKey, retkey );
 }
 /*************************************************************************
@@ -752,7 +752,7 @@
  */
 HRESULT WINAPI SHRegQueryValueExA(DWORD u, LPSTR v, DWORD w, DWORD x,
 				  DWORD y, DWORD z)
-{	FIXME(shell,"0x%04lx %s 0x%04lx 0x%04lx 0x%04lx  0x%04lx stub\n",
+{	FIXME("0x%04lx %s 0x%04lx 0x%04lx 0x%04lx  0x%04lx stub\n",
 		u,debugstr_a(v),w,x,y,z);
 	return 0;
 }
@@ -762,7 +762,7 @@
  */
 HRESULT WINAPI SHRegQueryValueW (HKEY hkey, LPWSTR lpszSubKey,
 				 LPWSTR lpszData, LPDWORD lpcbData )
-{	WARN(shell,"0x%04x %s %p %p semi-stub\n",
+{	WARN("0x%04x %s %p %p semi-stub\n",
 		hkey, debugstr_w(lpszSubKey), lpszData, lpcbData);
 	return RegQueryValueW( hkey, lpszSubKey, lpszData, lpcbData );
 }
@@ -777,7 +777,7 @@
 HRESULT WINAPI SHRegQueryValueExW (HKEY hkey, LPWSTR pszValue, LPDWORD pdwReserved,
 		 LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData)
 {	DWORD ret;
-	WARN(shell,"0x%04x %s %p %p %p %p semi-stub\n",
+	WARN("0x%04x %s %p %p %p %p semi-stub\n",
 		hkey, debugstr_w(pszValue), pdwReserved, pdwType, pvData, pcbData);
 	ret = RegQueryValueExW ( hkey, pszValue, pdwReserved, pdwType, pvData, pcbData);
 	return ret;
@@ -788,7 +788,7 @@
  *
  */
 HRESULT WINAPI ReadCabinetState(DWORD u, DWORD v)
-{	FIXME(shell,"0x%04lx 0x%04lx stub\n",u,v);
+{	FIXME("0x%04lx 0x%04lx stub\n",u,v);
 	return 0;
 }
 /*************************************************************************
@@ -796,7 +796,7 @@
  *
  */
 HRESULT WINAPI WriteCabinetState(DWORD u)
-{	FIXME(shell,"0x%04lx stub\n",u);
+{	FIXME("0x%04lx stub\n",u);
 	return 0;
 }
 /*************************************************************************
@@ -804,7 +804,7 @@
  *
  */
 BOOL WINAPI FileIconInit(BOOL bFullInit)
-{	FIXME(shell,"(%s)\n", bFullInit ? "true" : "false");
+{	FIXME("(%s)\n", bFullInit ? "true" : "false");
 	return 0;
 }
 /*************************************************************************
@@ -812,7 +812,7 @@
  *
  */
 HRESULT WINAPI IsUserAdmin(void)
-{	FIXME(shell,"stub\n");
+{	FIXME("stub\n");
 	return TRUE;
 }
 /*************************************************************************
@@ -824,7 +824,7 @@
  *  the pidl is for STRRET OFFSET
  */
 HRESULT WINAPI StrRetToStrN (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
-{	TRACE(shell,"dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
+{	TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
 
 	switch (src->uType)
 	{ case STRRET_WSTR:
@@ -849,7 +849,7 @@
 	    }
 
 	  default:
-	    FIXME(shell,"unknown type!\n");
+	    FIXME("unknown type!\n");
 	    if (len)
 	    { *(LPSTR)dest = '\0';
 	    }
@@ -865,7 +865,7 @@
 LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
 {	LPWSTR ptr=str;
 	
-	TRACE(shell,"%s 0x%04x\n",debugstr_w(str),x);
+	TRACE("%s 0x%04x\n",debugstr_w(str),x);
 	do 
 	{  if (*ptr==x)
 	   { return ptr;
@@ -880,7 +880,7 @@
  *
  */
 INT WINAPI StrCmpNIW ( LPWSTR wstr1, LPWSTR wstr2, INT len)
-{	FIXME( shell,"%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
+{	FIXME("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
 	return 0;
 }
 
@@ -900,7 +900,7 @@
 {	HGLOBAL hmem;
 	LPVOID pmem;
 	
-	TRACE(shell,"ptr=%p size=0x%04lx procID=0x%04lx\n",psrc,size,procID);
+	TRACE("ptr=%p size=0x%04lx procID=0x%04lx\n",psrc,size,procID);
 	hmem = GlobalAlloc(GMEM_FIXED, size);
 	if (!hmem)
 	  return 0;
@@ -924,7 +924,7 @@
  *  the returnvalue seems to be a memoryadress
  */
 LPVOID WINAPI SHLockShared(HANDLE hmem, DWORD procID)
-{	TRACE(shell,"handle=0x%04x procID=0x%04lx\n",hmem,procID);
+{	TRACE("handle=0x%04x procID=0x%04lx\n",hmem,procID);
 	return GlobalLock(hmem);
 }
 /*************************************************************************
@@ -934,7 +934,7 @@
  *  parameter1 is return value from SHLockShared
  */
 BOOL WINAPI SHUnlockShared(HANDLE pmem)
-{	TRACE(shell,"handle=0x%04x\n",pmem);
+{	TRACE("handle=0x%04x\n",pmem);
 	return GlobalUnlock(pmem); 
 }
 /*************************************************************************
@@ -945,7 +945,7 @@
  *  parameter2 is return value from GetCurrentProcessId
  */
 HANDLE WINAPI SHFreeShared(HANDLE hmem, DWORD procID)
-{	TRACE(shell,"handle=0x%04x 0x%04lx\n",hmem,procID);
+{	TRACE("handle=0x%04x 0x%04lx\n",hmem,procID);
 	return GlobalFree(hmem);
 }
 
@@ -954,7 +954,7 @@
  *
  */
 HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v)
-{	FIXME(shell,"hwnd=0x%04x 0x%04lx stub\n",u,v );
+{	FIXME("hwnd=0x%04x 0x%04lx stub\n",u,v );
 	return 0;
 }
 /*************************************************************************
@@ -962,7 +962,7 @@
  *
  */
 HRESULT WINAPI SHLoadOLE(DWORD u)
-{	FIXME(shell,"0x%04lx stub\n",u);
+{	FIXME("0x%04lx stub\n",u);
 	return S_OK;
 }
 /*************************************************************************
@@ -970,7 +970,7 @@
  *
  */
 HRESULT WINAPI DriveType(DWORD u)
-{	FIXME(shell,"0x%04lx stub\n",u);
+{	FIXME("0x%04lx stub\n",u);
 	return 0;
 }
 /*************************************************************************
@@ -978,7 +978,7 @@
  *
  */
 HRESULT WINAPI SHAbortInvokeCommand(void)
-{	FIXME(shell,"stub\n");
+{	FIXME("stub\n");
 	return 1;
 }
 /*************************************************************************
@@ -986,7 +986,7 @@
  *
  */
 HRESULT WINAPI SHOutOfMemoryMessageBox(DWORD u, DWORD v, DWORD w)
-{	FIXME(shell,"0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w);
+{	FIXME("0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w);
 	return 0;
 }
 /*************************************************************************
@@ -994,7 +994,7 @@
  *
  */
 HRESULT WINAPI SHFlushClipboard(void)
-{	FIXME(shell,"stub\n");
+{	FIXME("stub\n");
 	return 1;
 }
 /*************************************************************************
@@ -1003,7 +1003,7 @@
  */
 LPWSTR WINAPI StrRChrW(LPWSTR lpStart, LPWSTR lpEnd, DWORD wMatch)
 {	LPWSTR wptr=NULL;
-	TRACE(shell,"%s %s 0x%04x\n",debugstr_w(lpStart),debugstr_w(lpEnd), (WCHAR)wMatch );
+	TRACE("%s %s 0x%04x\n",debugstr_w(lpStart),debugstr_w(lpEnd), (WCHAR)wMatch );
 
 	/* if the end not given, search*/
 	if (!lpEnd)
@@ -1024,7 +1024,7 @@
 */
 LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
 {	char buf[64];
-	TRACE(shell,"%lx %p %i\n", dw, pszBuf, cchBuf);
+	TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
 	if ( dw<1024L )
 	{ sprintf (buf,"%3.1f bytes", (FLOAT)dw);
 	}
@@ -1042,7 +1042,7 @@
 }
 LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf )
 {	char buf[64];
-	TRACE(shell,"%lx %p %i\n", dw, pszBuf, cchBuf);
+	TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
 	if ( dw<1024L )
 	{ sprintf (buf,"%3.1f bytes", (FLOAT)dw);
 	}
@@ -1063,7 +1063,7 @@
  *
  */
 HRESULT WINAPI SHWaitForFileToOpen(DWORD u, DWORD v, DWORD w)
-{	FIXME(shell,"0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w);
+{	FIXME("0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w);
 	return 0;
 }
 /*************************************************************************
@@ -1071,7 +1071,7 @@
  *
  */
 HRESULT WINAPI Control_FillCache_RunDLL(HWND hWnd, HANDLE hModule, DWORD w, DWORD x)
-{	FIXME(shell,"0x%04x 0x%04x 0x%04lx 0x%04lx stub\n",hWnd, hModule,w,x);
+{	FIXME("0x%04x 0x%04x 0x%04lx 0x%04lx stub\n",hWnd, hModule,w,x);
 	return 0;
 }
 /*************************************************************************
@@ -1079,7 +1079,7 @@
  * the name is propably wrong
  */
 HRESULT WINAPI RunDLL_CallEntry16(DWORD v, DWORD w, DWORD x, DWORD y, DWORD z)
-{	FIXME(shell,"0x%04lx 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",v,w,x,y,z);
+{	FIXME("0x%04lx 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",v,w,x,y,z);
 	return 0;
 }
 
@@ -1088,7 +1088,7 @@
  *
  */
 HRESULT WINAPI shell32_654 (DWORD x, DWORD y)
-{	FIXME(shell,"0x%08lx 0x%08lx stub\n",x,y);
+{	FIXME("0x%08lx 0x%08lx stub\n",x,y);
 	return 0;
 }
 
@@ -1099,7 +1099,7 @@
  *   builds a DPA
  */
 DWORD WINAPI RLBuildListOfPaths ()
-{	FIXME (shell,"stub\n");
+{	FIXME("stub\n");
 	return 0;
 }
 /************************************************************************
@@ -1108,7 +1108,7 @@
  */
 int WINAPI StrToOleStr (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString)
 {
-	TRACE(shell,"%p %p(%s)\n",
+	TRACE("%p %p(%s)\n",
 	lpWideCharStr, lpMultiByteString, lpMultiByteString);
 
 	return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH);
@@ -1119,6 +1119,6 @@
  *
  */
 HRESULT WINAPI SHValidateUNC (DWORD x, DWORD y, DWORD z)
-{	FIXME(shell,"0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z);
+{	FIXME("0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z);
 	return 0;
 }
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 40f0bcd..0091faf 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -6,7 +6,7 @@
  */
 #include <string.h>
 #include <ctype.h>
-#include "debug.h"
+#include "debugtools.h"
 #include "winnls.h"
 #include "winversion.h"
 
@@ -19,7 +19,7 @@
  * PathIsRoot [SHELL32.29]
  */
 BOOL WINAPI PathIsRootA(LPCSTR x)
-{	TRACE(shell,"%s\n",x);
+{	TRACE("%s\n",x);
 	if (*(x+1)==':' && *(x+2)=='\\')		/* "X:\" */
 	  return 1;
 	if (*x=='\\')		/* "\" */
@@ -37,7 +37,7 @@
 	return 0;
 }
 BOOL WINAPI PathIsRootW(LPCWSTR x) 
-{	TRACE(shell,"%s\n",debugstr_w(x));
+{	TRACE("%s\n",debugstr_w(x));
 	if (*(x+1)==':' && *(x+2)=='\\')		/* "X:\" */
 	  return 1;
 	if (*x == (WCHAR) '\\')		/* "\" */
@@ -64,7 +64,7 @@
  * PathBuildRoot [SHELL32.30]
  */
 LPSTR WINAPI PathBuildRootA(LPSTR root,BYTE drive) {
-  TRACE(shell,"%p %i\n",root, drive);
+  TRACE("%p %i\n",root, drive);
 	strcpy(root,"A:\\");
 	root[0]+=drive;
 	return root;
@@ -78,7 +78,7 @@
  */
 LPCSTR WINAPI PathFindExtensionA(LPCSTR path) 
 {	LPCSTR   lastpoint = NULL;
-	TRACE(shell,"%p %s\n",path,path);
+	TRACE("%p %s\n",path,path);
 	while (*path) 
 	{ if (*path=='\\'||*path==' ')
 	    lastpoint=NULL;
@@ -90,7 +90,7 @@
 }
 LPCWSTR WINAPI PathFindExtensionW(LPCWSTR path) 
 {	LPCWSTR   lastpoint = NULL;
-	TRACE(shell,"%p L%s\n",path,debugstr_w(path));
+	TRACE("%p L%s\n",path,debugstr_w(path));
 	while (*path)
 	{ if (*path==(WCHAR)'\\'||*path==(WCHAR)' ')
 	    lastpoint=NULL;
@@ -115,7 +115,7 @@
  */
 LPSTR WINAPI PathAddBackslashA(LPSTR path)
 {	int len;
-	TRACE(shell,"%p->%s\n",path,path);
+	TRACE("%p->%s\n",path,path);
 
 	len = strlen(path);
 	if (len && path[len-1]!='\\') 
@@ -127,7 +127,7 @@
 }
 LPWSTR WINAPI PathAddBackslashW(LPWSTR path)
 {	int len;
-	TRACE(shell,"%p->%s\n",path,debugstr_w(path));
+	TRACE("%p->%s\n",path,debugstr_w(path));
 
 	len = lstrlenW(path);
 	if (len && path[len-1]!=(WCHAR)'\\') 
@@ -151,7 +151,7 @@
  */
 LPSTR WINAPI PathRemoveBlanksA(LPSTR str)
 {	LPSTR x = str;
-	TRACE(shell,"%s\n",str);
+	TRACE("%s\n",str);
 	while (*x==' ') x++;
 	if (x!=str)
 	  strcpy(str,x);
@@ -166,7 +166,7 @@
 }
 LPWSTR WINAPI PathRemoveBlanksW(LPWSTR str)
 {	LPWSTR x = str;
-	TRACE(shell,"%s\n",debugstr_w(str));
+	TRACE("%s\n",debugstr_w(str));
 	while (*x==' ') x++;
 	if (x!=str)
 	  lstrcpyW(str,x);
@@ -197,7 +197,7 @@
 {	LPCSTR aslash;
 	aslash = aptr;
 
-	TRACE(shell,"%s\n",aslash);
+	TRACE("%s\n",aslash);
 	while (aptr[0]) 
 	{ if (((aptr[0]=='\\') || (aptr[0]==':')) && aptr[1] && aptr[1]!='\\')
 	      aslash = aptr+1;
@@ -210,7 +210,7 @@
 {	LPCWSTR wslash;
 	wslash = wptr;
 
-	TRACE(shell,"L%s\n",debugstr_w(wslash));
+	TRACE("L%s\n",debugstr_w(wslash));
 	while (wptr[0]) 
 	{ if (((wptr[0]=='\\') || (wptr[0]==':')) && wptr[1] && wptr[1]!='\\')
 	    wslash = wptr+1;
@@ -237,7 +237,7 @@
  */
 DWORD WINAPI PathRemoveFileSpecA(LPSTR fn) {
 	LPSTR	x,cutplace;
-  TRACE(shell,"%s\n",fn);
+  TRACE("%s\n",fn);
 	if (!fn[0])
 		return 0;
 	x=fn;
@@ -277,7 +277,7 @@
  *     concats "target\\add" and writes them to target
  */
 LPSTR WINAPI PathAppendA(LPSTR x1,LPSTR x2) {
-  TRACE(shell,"%s %s\n",x1,x2);
+  TRACE("%s %s\n",x1,x2);
   while (x2[0]=='\\') x2++;
   return PathCombineA(x1,x1,x2);
 }
@@ -291,7 +291,7 @@
  */
 LPSTR WINAPI PathCombineA(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile) 
 {	char sTemp[MAX_PATH];
-	TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
+	TRACE("%p %p->%s %p->%s\n",szDest, lpszDir, lpszDir, lpszFile, lpszFile);
 	
 	
 	if (!lpszFile || !lpszFile[0] || (lpszFile[0]=='.' && !lpszFile[1]) ) 
@@ -313,7 +313,7 @@
 }
 LPWSTR WINAPI PathCombineW(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile) 
 {	WCHAR sTemp[MAX_PATH];
-	TRACE(shell,"%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
+	TRACE("%p %p->%s %p->%s\n",szDest, lpszDir, debugstr_w(lpszDir),
 			 lpszFile, debugstr_w(lpszFile));
 	
 	
@@ -347,14 +347,14 @@
  *     PathIsUNC(char*path);
  */
 BOOL WINAPI PathIsUNCA(LPCSTR path) 
-{	TRACE(shell,"%s\n",path);
+{	TRACE("%s\n",path);
 
 	if ((path[0]=='\\') && (path[1]=='\\'))
 	  return TRUE;
 	return FALSE;
 }
 BOOL WINAPI PathIsUNCW(LPCWSTR path) 
-{	TRACE(shell,"%s\n",debugstr_w(path));
+{	TRACE("%s\n",debugstr_w(path));
 
 	if ((path[0]=='\\') && (path[1]=='\\'))
 	  return TRUE;
@@ -370,14 +370,14 @@
  * 
  */
 BOOL WINAPI PathIsRelativeA (LPCSTR path)
-{	TRACE(shell,"path=%s\n",path);
+{	TRACE("path=%s\n",path);
 
 	if (path && (path[0]!='\\' && path[1]==':'))
 	  return TRUE;
 	return FALSE;    
 }
 BOOL WINAPI PathIsRelativeW (LPCWSTR path)
-{	TRACE(shell,"path=%s\n",debugstr_w(path));
+{	TRACE("path=%s\n",debugstr_w(path));
 
 	if (path && (path[0]!='\\' && path[1]==':'))
 	  return TRUE;
@@ -393,11 +393,11 @@
  * 
  */
 BOOL WINAPI PathIsExeA (LPCSTR path)
-{	FIXME(shell,"path=%s\n",path);
+{	FIXME("path=%s\n",path);
 	return FALSE;
 }
 BOOL WINAPI PathIsExeW (LPCWSTR path)
-{	FIXME(shell,"path=%s\n",debugstr_w(path));
+{	FIXME("path=%s\n",debugstr_w(path));
 	return FALSE;
 }
 BOOL WINAPI PathIsExeAW (LPCVOID path)
@@ -413,7 +413,7 @@
  *     file_exists(char *fn);
  */
 BOOL WINAPI PathFileExistsA(LPSTR fn) {
-  TRACE(shell,"%s\n",fn);
+  TRACE("%s\n",fn);
    if (GetFileAttributesA(fn)==-1)
     	return FALSE;
     else
@@ -429,7 +429,7 @@
 BOOL WINAPI PathMatchSpecA(LPCSTR name, LPCSTR mask) 
 {	LPCSTR _name;
 
-	TRACE(shell,"%s %s stub\n",name,mask);
+	TRACE("%s %s stub\n",name,mask);
 
 	_name = name;
 	while (*_name && *mask)
@@ -461,7 +461,7 @@
 {	WCHAR stemp[4];
 	LPCWSTR _name;
 	
-	TRACE(shell,"%s %s stub\n",debugstr_w(name),debugstr_w(mask));
+	TRACE("%s %s stub\n",debugstr_w(name),debugstr_w(mask));
 
 	lstrcpyAtoW(stemp,"*.*");	
 	if (!lstrcmpW( mask, stemp )) return 1;
@@ -504,11 +504,11 @@
  */
 
 BOOL WINAPI PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath) 
-{	TRACE(shell,"%x %x %s\n",hDlg, id, pszPath);
+{	TRACE("%x %x %s\n",hDlg, id, pszPath);
 	return SetDlgItemTextA(hDlg, id, pszPath);
 }
 BOOL WINAPI PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath) 
-{	TRACE(shell,"%x %x %s\n",hDlg, id, debugstr_w(pszPath));
+{	TRACE("%x %x %s\n",hDlg, id, debugstr_w(pszPath));
 	return SetDlgItemTextW(hDlg, id, pszPath);
 }
 BOOL WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath) 
@@ -522,11 +522,11 @@
  */
 
 BOOL WINAPI PathQualifyA(LPCSTR pszPath) 
-{	TRACE(shell,"%s\n",pszPath);
+{	TRACE("%s\n",pszPath);
 	return 0;
 }
 BOOL WINAPI PathQualifyW(LPCWSTR pszPath) 
-{	TRACE(shell,"%s\n",debugstr_w(pszPath));
+{	TRACE("%s\n",debugstr_w(pszPath));
 	return 0;
 }
 BOOL WINAPI PathQualifyAW(LPCVOID pszPath) 
@@ -539,7 +539,7 @@
  * PathResolve [SHELL32.51]
  */
 DWORD WINAPI PathResolve(LPCSTR s,DWORD x2,DWORD x3) {
-	FIXME(shell,"(%s,0x%08lx,0x%08lx),stub!\n",s,x2,x3);
+	FIXME("(%s,0x%08lx,0x%08lx),stub!\n",s,x2,x3);
 	return 0;
 }
 
@@ -553,7 +553,7 @@
 LPCSTR WINAPI PathGetArgsA(LPCSTR cmdline) 
 {	BOOL	qflag = FALSE;
 
-	TRACE(shell,"%s\n",cmdline);
+	TRACE("%s\n",cmdline);
 
 	while (*cmdline) 
 	{ if ((*cmdline==' ') && !qflag)
@@ -568,7 +568,7 @@
 LPCWSTR WINAPI PathGetArgsW(LPCWSTR cmdline) 
 {	BOOL	qflag = FALSE;
 
-	TRACE(shell,"%sL\n",debugstr_w(cmdline));
+	TRACE("%sL\n",debugstr_w(cmdline));
 
 	while (*cmdline) 
 	{ if ((*cmdline==' ') && !qflag)
@@ -591,12 +591,12 @@
  *     basename(char *fn);
  */
 LPSTR WINAPI PathQuoteSpacesA(LPCSTR aptr)
-{	FIXME(shell,"%s\n",aptr);
+{	FIXME("%s\n",aptr);
 	return 0;
 
 }
 LPWSTR WINAPI PathQuoteSpacesW(LPCWSTR wptr)
-{	FIXME(shell,"L%s\n",debugstr_w(wptr));
+{	FIXME("L%s\n",debugstr_w(wptr));
 	return 0;	
 }
 LPVOID WINAPI PathQuoteSpacesAW (LPCVOID fn)
@@ -614,7 +614,7 @@
  */
 VOID WINAPI PathUnquoteSpacesA(LPSTR str) 
 {	DWORD      len = lstrlenA(str);
-	TRACE(shell,"%s\n",str);
+	TRACE("%s\n",str);
 	if (*str!='"')
 	  return;
 	if (str[len-1]!='"')
@@ -626,7 +626,7 @@
 VOID WINAPI PathUnquoteSpacesW(LPWSTR str) 
 {	DWORD len = lstrlenW(str);
 
-	TRACE(shell,"%s\n",debugstr_w(str));
+	TRACE("%s\n",debugstr_w(str));
 
 	if (*str!='"')
 	  return;
@@ -648,7 +648,7 @@
  *
  */
 HRESULT WINAPI PathGetDriveNumber(LPSTR u)
-{	FIXME(shell,"%s stub\n",debugstr_a(u));
+{	FIXME("%s stub\n",debugstr_a(u));
 	return 0;
 }
 
@@ -659,7 +659,7 @@
  *     exported by ordinal
  */
 BOOL WINAPI PathYetAnotherMakeUniqueNameA(LPDWORD x,LPDWORD y) {
-    FIXME(shell,"(%p,%p):stub.\n",x,y);
+    FIXME("(%p,%p):stub.\n",x,y);
     return TRUE;
 }
 
@@ -680,11 +680,11 @@
  * PathFindOnPath [SHELL32.145]
  */
 BOOL WINAPI PathFindOnPathA(LPSTR sFile, LPCSTR sOtherDirs)
-{	FIXME(shell,"%s %s\n",sFile, sOtherDirs);
+{	FIXME("%s %s\n",sFile, sOtherDirs);
 	return FALSE;
 }
 BOOL WINAPI PathFindOnPathW(LPWSTR sFile, LPCWSTR sOtherDirs)
-{	FIXME(shell,"%s %s\n",debugstr_w(sFile), debugstr_w(sOtherDirs));
+{	FIXME("%s %s\n",debugstr_w(sFile), debugstr_w(sOtherDirs));
 	return FALSE;
 }
 BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs)
@@ -700,12 +700,12 @@
  *     exported by ordinal
  */
 LPCSTR WINAPI PathGetExtensionA(LPCSTR path,DWORD y,DWORD z)
-{	TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
+{	TRACE("(%s,%08lx,%08lx)\n",path,y,z);
 	path = PathFindExtensionA(path);
 	return *path?(path+1):path;
 }
 LPCWSTR WINAPI PathGetExtensionW(LPCWSTR path,DWORD y,DWORD z)
-{	TRACE(shell,"(L%s,%08lx,%08lx)\n",debugstr_w(path),y,z);
+{	TRACE("(L%s,%08lx,%08lx)\n",debugstr_w(path),y,z);
 	path = PathFindExtensionW(path);
 	return *path?(path+1):path;
 }
@@ -720,7 +720,7 @@
  *
  */
 HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
-{	FIXME(shell,"%p %p stub\n",u,v);
+{	FIXME("%p %p stub\n",u,v);
 	return 0;
 }
 
@@ -729,7 +729,7 @@
  *
  */
 HRESULT WINAPI SheChangeDirW(LPWSTR u)
-{	FIXME(shell,"(%s),stub\n",debugstr_w(u));
+{	FIXME("(%s),stub\n",debugstr_w(u));
 	return 0;
 }
 
@@ -737,7 +737,7 @@
 *	PathProcessCommand	[SHELL32.653]
 */
 HRESULT WINAPI PathProcessCommand (DWORD u, DWORD v, DWORD w, DWORD x)
-{	FIXME(shell,"0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w,x);
+{	FIXME("0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w,x);
 	return 0;
 }
 
@@ -750,7 +750,7 @@
 BOOL WINAPI SHGetSpecialFolderPathA (DWORD x1,LPSTR szPath,DWORD csidl,DWORD x4) 
 {	LPITEMIDLIST pidl;
 
-	WARN(shell,"(0x%04lx,%p,csidl=%lu,0x%04lx) semi-stub\n", x1,szPath,csidl,x4);
+	WARN("(0x%04lx,%p,csidl=%lu,0x%04lx) semi-stub\n", x1,szPath,csidl,x4);
 
 	SHGetSpecialFolderLocation(0, csidl, &pidl);
 	SHGetPathFromIDListA (pidl, szPath);
@@ -760,7 +760,7 @@
 BOOL WINAPI SHGetSpecialFolderPathW (DWORD x1,LPWSTR szPath, DWORD csidl,DWORD x4) 
 {	LPITEMIDLIST pidl;
 
-	WARN(shell,"(0x%04lx,%p,csidl=%lu,0x%04lx) semi-stub\n", x1,szPath,csidl,x4);
+	WARN("(0x%04lx,%p,csidl=%lu,0x%04lx) semi-stub\n", x1,szPath,csidl,x4);
 
 	SHGetSpecialFolderLocation(0, csidl, &pidl);
 	SHGetPathFromIDListW (pidl, szPath);
diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c
index 1cb591c..6f44144 100644
--- a/dlls/shell32/shlfolder.c
+++ b/dlls/shell32/shlfolder.c
@@ -9,7 +9,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 
 #include "oleidl.h"
@@ -63,7 +63,7 @@
 	char	xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
 
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	if ( !This || !ppvObj)
 	  return E_INVALIDARG;
@@ -79,11 +79,11 @@
 
 	if(*ppvObj)
 	{ IDropTarget_AddRef((IDropTarget*)*ppvObj);
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
 
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 
 	return E_NOINTERFACE;
 }
@@ -92,7 +92,7 @@
 {
 	ICOM_THIS(ISFDropTarget,iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 
@@ -106,7 +106,7 @@
 	shell32_ObjCount--;
 
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying ISFDropTarget (%p)\n",This);
+	{ TRACE("-- destroying ISFDropTarget (%p)\n",This);
 	  HeapFree(GetProcessHeap(),0,This);
 	  return 0;
 	}
@@ -123,7 +123,7 @@
 
 	ICOM_THIS(ISFDropTarget,iface);
 
-	FIXME(shell, "Stub: This=%p, DataObject=%p\n",This,pDataObject);
+	FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
 
 	return E_NOTIMPL;
 }
@@ -136,7 +136,7 @@
 {
 	ICOM_THIS(ISFDropTarget,iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -146,7 +146,7 @@
 {
 	ICOM_THIS(ISFDropTarget,iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -160,7 +160,7 @@
 {
 	ICOM_THIS(ISFDropTarget,iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -193,7 +193,7 @@
 LPSTR GetNextElement(LPSTR pszNext,LPSTR pszOut,DWORD dwOut)
 {	LPSTR   pszTail = pszNext;
 	DWORD dwCopy;
-	TRACE(shell,"(%s %p 0x%08lx)\n",debugstr_a(pszNext),pszOut,dwOut);
+	TRACE("(%s %p 0x%08lx)\n",debugstr_a(pszNext),pszOut,dwOut);
 
 	if(!pszNext || !*pszNext)
 	  return NULL;
@@ -208,7 +208,7 @@
 	{  pszTail++;
 	}
 
-	TRACE(shell,"--(%s %s 0x%08lx)\n",debugstr_a(pszNext),debugstr_a(pszOut),dwOut);
+	TRACE("--(%s %s 0x%08lx)\n",debugstr_a(pszNext),debugstr_a(pszOut),dwOut);
 	return pszTail;
 }
 
@@ -240,7 +240,7 @@
 	sf->sMyPath=NULL;	/* path of the folder */
 	sf->pMyPidl=NULL;	/* my qualified pidl */
 
-	TRACE(shell,"(%p)->(parent=%p, pidl=%p)\n",sf,pParent, pidl);
+	TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,pParent, pidl);
 	pdump(pidl);
 		
 	/* keep a copy of the pidl in the instance*/
@@ -250,7 +250,7 @@
 	{ dwSize = 0;
 	  if(pParent->sMyPath)			/* get the size of the parents path */
 	  { dwSize += strlen(pParent->sMyPath) ;
-	    TRACE(shell,"-- (%p)->(parent's path=%s)\n",sf, debugstr_a(pParent->sMyPath));
+	    TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a(pParent->sMyPath));
 	  }   
 	  dwSize += _ILGetFolderText(sf->mpidl,NULL,0); /* add the size of the foldername*/
 	  sf->sMyPath = SHAlloc(dwSize+2);		/* '\0' and backslash */
@@ -264,7 +264,7 @@
 	    sf->pMyPidl = ILCombine(pParent->pMyPidl, pidl);
 	    len = strlen(sf->sMyPath);
 	    _ILGetFolderText(sf->mpidl, sf->sMyPath+len, dwSize-len);
-	    TRACE(shell,"-- (%p)->(my pidl=%p, my path=%s)\n",sf, sf->pMyPidl,debugstr_a(sf->sMyPath));
+	    TRACE("-- (%p)->(my pidl=%p, my path=%s)\n",sf, sf->pMyPidl,debugstr_a(sf->sMyPath));
 	    pdump (sf->pMyPidl);
 	  }
 	}
@@ -287,7 +287,7 @@
 
 	char	xriid[50];	
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -303,10 +303,10 @@
 
 	if(*ppvObj)
 	{ IShellFolder_AddRef((IShellFolder*)*ppvObj);
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }
 
@@ -318,7 +318,7 @@
 {
 	ICOM_THIS(IGenericSFImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -331,15 +331,15 @@
 {
 	ICOM_THIS(IGenericSFImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell,"-- destroying IShellFolder(%p)\n",This);
+	{ TRACE("-- destroying IShellFolder(%p)\n",This);
 
 	  if (pdesktopfolder == iface)
 	  { pdesktopfolder=NULL;
-	    TRACE(shell,"-- destroyed IShellFolder(%p) was Desktopfolder\n",This);
+	    TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This);
 	  }
 	  if(This->pMyPidl)
 	  { SHFree(This->pMyPidl);
@@ -387,7 +387,7 @@
 	CHAR		szTemp[MAX_PATH],szElement[MAX_PATH];
 	BOOL		bIsFile;
 
-	TRACE(shell,"(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
+	TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
 	This,hwndOwner,pbcReserved,lpszDisplayName,
 	debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
 
@@ -458,11 +458,11 @@
 {
 	ICOM_THIS(IGenericSFImpl, iface);
 
-	TRACE(shell,"(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
+	TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
 
 	*ppEnumIDList = NULL;
 	*ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags);
-	TRACE(shell,"-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
+	TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
 	if(!*ppEnumIDList)
 	{ return E_OUTOFMEMORY;
 	}
@@ -488,7 +488,7 @@
 	
 	WINE_StringFromCLSID(riid,xriid);
 
-	TRACE(shell,"(%p)->(pidl=%p,%p,\n\tIID:%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
+	TRACE("(%p)->(pidl=%p,%p,\n\tIID:%s,%p)\n",This,pidl,pbcReserved,xriid,ppvOut);
 
 	*ppvOut = NULL;
 
@@ -499,7 +499,7 @@
 
 	hr = pShellFolder->lpvtbl->fnQueryInterface(pShellFolder, riid, ppvOut);
 	pShellFolder->lpvtbl->fnRelease(pShellFolder);
-	TRACE(shell,"-- (%p)->(interface=%p)\n",This, ppvOut);
+	TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
 	return hr;
 }
 
@@ -523,7 +523,7 @@
 	char xriid[50];
 	WINE_StringFromCLSID(riid,xriid);
 
-	FIXME(shell,"(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",This,pidl,pbcReserved,xriid,ppvOut);
+	FIXME("(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",This,pidl,pbcReserved,xriid,ppvOut);
 
 	*ppvOut = NULL;
 	return E_NOTIMPL;
@@ -557,7 +557,7 @@
 	int   nReturn;
 	LPCITEMIDLIST  pidlTemp1 = pidl1, pidlTemp2 = pidl2;
 
-	TRACE(shell,"(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",This,lParam,pidl1,pidl2);
+	TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",This,lParam,pidl1,pidl2);
 	pdump (pidl1);
 	pdump (pidl2);
 
@@ -621,7 +621,7 @@
 	HRESULT       hr;
 
 	WINE_StringFromCLSID(riid,xriid);
-	TRACE(shell,"(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
+	TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,xriid,ppvOut);
 	
 	*ppvOut = NULL;
 
@@ -632,7 +632,7 @@
 	  
 	hr = pShellView->lpvtbl->fnQueryInterface(pShellView, riid, ppvOut);
 	pShellView->lpvtbl->fnRelease(pShellView);
-	TRACE(shell,"-- (%p)->(interface=%p)\n",This, ppvOut);
+	TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
 	return hr; 
 }
 
@@ -658,7 +658,7 @@
 	LPCITEMIDLIST * pidltemp;
 	DWORD i;
 
-	TRACE(shell,"(%p)->(%d,%p,%p)\n",This,cidl,apidl,rgfInOut);
+	TRACE("(%p)->(%d,%p,%p)\n",This,cidl,apidl,rgfInOut);
 
 	if ( (!cidl) || (!apidl) || (!rgfInOut))
 	  return E_INVALIDARG;
@@ -667,7 +667,7 @@
 	*rgfInOut = 0x00;
 	i=cidl;
 
-	TRACE(shell,"-- mask=0x%08lx\n",*rgfInOut);
+	TRACE("-- mask=0x%08lx\n",*rgfInOut);
 
 	do
 	{ if (*pidltemp)
@@ -734,7 +734,7 @@
 
 	WINE_StringFromCLSID(riid,xclsid);
 
-	TRACE(shell,"(%p)->(%u,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
+	TRACE("(%p)->(%u,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
 	  This,hwndOwner,cidl,apidl,xclsid,prgfInOut,ppvOut);
 
 	*ppvOut = NULL;
@@ -771,7 +771,7 @@
 	}
 	else
 	{ 
-	  ERR(shell,"(%p)->E_NOINTERFACE\n",This);
+	  ERR("(%p)->E_NOINTERFACE\n",This);
 	  return E_NOINTERFACE;
 	}
 
@@ -812,7 +812,7 @@
 	LPITEMIDLIST	pidlTemp=NULL;
 	BOOL	bSimplePidl=FALSE;
 		
-	TRACE(shell,"(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,lpName);
+	TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,lpName);
 	pdump(pidl);
 	
 	szSpecial[0]=0x00; 
@@ -824,7 +824,7 @@
 	pidlTemp = ILGetNext(pidl);
 	if (pidlTemp && pidlTemp->mkid.cb==0x00)
 	{ bSimplePidl = TRUE;
-	  TRACE(shell,"-- simple pidl\n");
+	  TRACE("-- simple pidl\n");
 	}
 
 	if (_ILIsDesktop( pidl))
@@ -888,7 +888,7 @@
 	      }
 	      break;
 	    default:
-	      TRACE(shell,"--- wrong flags=%lx\n", dwFlags);
+	      TRACE("--- wrong flags=%lx\n", dwFlags);
 	      return E_INVALIDARG;
 	  }
 	  if ((szText[0]==0x00 && szDrive[0]!=0x00)|| (bSimplePidl && szDrive[0]!=0x00))
@@ -899,7 +899,7 @@
 	  }
 	}
 
-	TRACE(shell,"-- (%p)->(%s)\n",This,szText);
+	TRACE("-- (%p)->(%s)\n",This,szText);
 
 	if(!(lpName))
 	{  return E_OUTOFMEMORY;
@@ -931,7 +931,7 @@
 {
 	ICOM_THIS(IGenericSFImpl, iface);
 
-	FIXME(shell,"(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n",
+	FIXME("(%p)->(%u,pidl=%p,%s,%lu,%p),stub!\n",
 	This,hwndOwner,pidl,debugstr_w(lpName),dw,pPidlOut);
 
 	return E_NOTIMPL;
@@ -946,7 +946,7 @@
 	ICOM_THIS(IGenericSFImpl, iface);
 	DWORD	dwSize;
 	
-	TRACE(shell,"(%p)->(%p %lu)\n",This, lpszOut, dwOutSize);
+	TRACE("(%p)->(%p %lu)\n",This, lpszOut, dwOutSize);
 	if (!lpszOut)
 	{ return FALSE;
 	}
@@ -961,7 +961,7 @@
 	  return FALSE;
 	strcpy(lpszOut, This->sMyPath);
 
-	TRACE(shell,"-- (%p)->(return=%s)\n",This, lpszOut);
+	TRACE("-- (%p)->(return=%s)\n",This, lpszOut);
 	return TRUE;
 }
 
diff --git a/dlls/shell32/shlmenu.c b/dlls/shell32/shlmenu.c
index 4625e4d..d803c5e 100644
--- a/dlls/shell32/shlmenu.c
+++ b/dlls/shell32/shlmenu.c
@@ -9,7 +9,7 @@
 #include "wine/obj_shellfolder.h"
 
 #include "heap.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winversion.h"
 #include "shell32_main.h"
 
@@ -79,7 +79,7 @@
 {
 	LPFMINFO	menudata;
 
-	TRACE(shell,"\n");
+	TRACE("\n");
 	
 	menudata = FM_GetMenuInfo(hmenu);
 	
@@ -111,7 +111,7 @@
 	MENUINFO	MenuInfo;
 	LPFMINFO	menudata;
 
-	TRACE(shell,"\n");
+	TRACE("\n");
 
 	MenuInfo.cbSize = sizeof(MENUINFO);
 	MenuInfo.fMask = MIM_MENUDATA;
@@ -181,9 +181,9 @@
 
 		if (lpfnCallback)
 		{
-		  TRACE(shell,"enter callback\n");
+		  TRACE("enter callback\n");
 		  lpfnCallback ( pidl, pidlTemp);
-		  TRACE(shell,"leave callback\n");
+		  TRACE("leave callback\n");
 		}
 
 		NumberOfItems++;
@@ -219,7 +219,7 @@
 
 	HMENU hMenu = CreatePopupMenu();
 
-	TRACE(shell,"0x%08lx 0x%08x 0x%08x 0x%08x 0x%08x  hMenu=0x%08x\n",
+	TRACE("0x%08lx 0x%08x 0x%08x 0x%08x 0x%08x  hMenu=0x%08x\n",
 	crBorderColor, nBorderWidth, hBorderBmp, nSelHeight, uFlags, hMenu);
 
 	menudata = (LPFMINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO));
@@ -246,7 +246,7 @@
 {
 	LPFMINFO	menudata;
 
-	TRACE(shell,"0x%08x\n", hmenu);
+	TRACE("0x%08x\n", hmenu);
 
 	FileMenu_DeleteAllItems (hmenu);
 	
@@ -276,7 +276,7 @@
 	MENUITEMINFOA	mii;
 	LPFMITEM myItem;
 
-	TRACE(shell,"0x%08x %s 0x%08x 0x%08x 0x%08x 0x%08x\n",
+	TRACE("0x%08x %s 0x%08x 0x%08x 0x%08x 0x%08x\n",
 	hMenu, (lpszText!=FM_SEPARATOR) ? lpText: NULL,
 	uID, icon, hMenuPopup, nItemHeight);
 	
@@ -353,7 +353,7 @@
 	UINT uEnumFlags,
 	LPFNFMCALLBACK lpfnCallback)
 {	
-	TRACE(shell,"0x%08x 0x%08x %p 0x%08x 0x%08x %p\n",
+	TRACE("0x%08x 0x%08x %p 0x%08x 0x%08x %p\n",
 	hmenu, uID, pidl, uFlags, uEnumFlags, lpfnCallback);
 
 	pdump (pidl);
@@ -376,7 +376,7 @@
 	UINT	uEnumFlags,
 	LPFNFMCALLBACK lpfnCallback)
 {
-	TRACE(shell,"0x%08x 0x%08x %p 0x%08x %p\n",
+	TRACE("0x%08x 0x%08x %p 0x%08x %p\n",
 	hmenu, uID, pidl, uEnumFlags, lpfnCallback);
 	
 	FileMenu_DeleteAllItems (hmenu);
@@ -391,7 +391,7 @@
  */
 void WINAPI FileMenu_Invalidate (HMENU hMenu)
 {
-	FIXME(shell,"0x%08x\n",hMenu);	
+	FIXME("0x%08x\n",hMenu);	
 }
 
 /*************************************************************************
@@ -401,7 +401,7 @@
 	HMENU	hMenu,
 	LPCITEMIDLIST	pidl)
 {
-	FIXME(shell,"0x%08x %p\n",hMenu, pidl);	
+	FIXME("0x%08x %p\n",hMenu, pidl);	
 	return 0;
 }
 
@@ -424,7 +424,7 @@
 	if (bAddSeperator)
 	  FileMenu_AppendItemA (hmenu, FM_SEPARATOR, 0, 0, 0, FM_DEFAULT_HEIGHT);
 
-	TRACE (shell,"0x%08x %p 0x%08x\n",hmenu, pidl,bAddSeperator);	
+	TRACE("0x%08x %p 0x%08x\n",hmenu, pidl,bAddSeperator);	
 
 	return 0;
 }
@@ -443,7 +443,7 @@
 	UINT	uEnumFlags,
 	LPFNFMCALLBACK	lpfnCallback)
 {
-	TRACE(shell,"0x%08x 0x%08x 0x%08x %p 0x%08x 0x%08x %p\n",
+	TRACE("0x%08x 0x%08x 0x%08x %p 0x%08x 0x%08x %p\n",
 	hmenu, uReserved, uID, pidl, uFlags, uEnumFlags, lpfnCallback);
 
 	return FileMenu_InsertUsingPidl ( hmenu, uID, pidl, uFlags, uEnumFlags, lpfnCallback);
@@ -462,7 +462,7 @@
 	HWND hWnd,
 	LPTPMPARAMS lptpm)
 {
-	TRACE(shell,"0x%08x 0x%08x 0x%x 0x%x 0x%08x %p\n",
+	TRACE("0x%08x 0x%08x 0x%x 0x%x 0x%08x %p\n",
 	hMenu, uFlags, x, y, hWnd, lptpm);
 	return TrackPopupMenuEx(hMenu, uFlags, x, y, hWnd, lptpm);
 }
@@ -475,7 +475,7 @@
 	LPCITEMIDLIST	*ppidlFolder,
 	LPCITEMIDLIST	*ppidlItem)
 {
-	FIXME(shell,"0x%08x %p %p\n",uReserved, ppidlFolder, ppidlItem);
+	FIXME("0x%08x %p %p\n",uReserved, ppidlFolder, ppidlItem);
 	return 0;
 }
 
@@ -497,7 +497,7 @@
 	SIZE size;
 	LPFMINFO menuinfo;
 		
-	TRACE(shell,"0x%08x %p %s\n", hWnd, lpmis, pMyItem->szItemText);
+	TRACE("0x%08x %p %s\n", hWnd, lpmis, pMyItem->szItemText);
 	
 	GetTextExtentPoint32A(hdc, pMyItem->szItemText, pMyItem->cchItemText, &size);
 	
@@ -509,7 +509,7 @@
 	if (menuinfo->bIsMagic)
 	  lpmis->itemWidth += menuinfo->nBorderWidth;
 	
-	TRACE(shell,"-- 0x%04x 0x%04x\n", lpmis->itemWidth, lpmis->itemHeight);
+	TRACE("-- 0x%04x 0x%04x\n", lpmis->itemWidth, lpmis->itemHeight);
 	ReleaseDC (hWnd, hdc);
 	return 0;
 }
@@ -527,7 +527,7 @@
 	RECT TextRect, BorderRect;
 	LPFMINFO menuinfo;
 	
-	TRACE(shell,"0x%08x %p %s\n", hWnd, lpdis, pMyItem->szItemText);
+	TRACE("0x%08x %p %s\n", hWnd, lpdis, pMyItem->szItemText);
 	
 	if (lpdis->itemState & ODS_SELECTED)
 	{
@@ -563,7 +563,7 @@
 	Shell_GetImageList(0, &hImageList);
 	pImageList_Draw(hImageList, pMyItem->iIconIndex, lpdis->hDC, xi, yi, ILD_NORMAL);
 
-	TRACE(shell,"-- 0x%04x 0x%04x 0x%04x 0x%04x\n", TextRect.left, TextRect.top, TextRect.right, TextRect.bottom);
+	TRACE("-- 0x%04x 0x%04x 0x%04x 0x%04x\n", TextRect.left, TextRect.top, TextRect.right, TextRect.bottom);
 	
 	SetTextColor(lpdis->hDC, clrPrevText);
 	SetBkColor(lpdis->hDC, clrPrevBkgnd);
@@ -592,7 +592,7 @@
 	HMENU	hMenu,
 	WPARAM	wParam)
 {
-	FIXME(shell,"0x%08x 0x%08x\n",hMenu,wParam);
+	FIXME("0x%08x 0x%08x\n",hMenu,wParam);
 	return 0;
 }
 
@@ -609,7 +609,7 @@
 
 	int i;
 	
-	TRACE(shell,"0x%08x\n", hmenu);
+	TRACE("0x%08x\n", hmenu);
 	
 	ZeroMemory ( &mii, sizeof(MENUITEMINFOA));
 	mii.cbSize = sizeof(MENUITEMINFOA);
@@ -642,7 +642,7 @@
 {
 	MENUITEMINFOA mii;
 
-	TRACE(shell,"0x%08x 0x%08x\n", hMenu, uID);
+	TRACE("0x%08x 0x%08x\n", hMenu, uID);
 	
 	ZeroMemory ( &mii, sizeof(MENUITEMINFOA));
 	mii.cbSize = sizeof(MENUITEMINFOA);
@@ -662,7 +662,7 @@
 {
 	MENUITEMINFOA mii;
 
-	TRACE(shell,"0x%08x 0x%08x\n", hMenu, uPos);
+	TRACE("0x%08x 0x%08x\n", hMenu, uPos);
 
 	ZeroMemory ( &mii, sizeof(MENUITEMINFOA));
 	mii.cbSize = sizeof(MENUITEMINFOA);
@@ -682,7 +682,7 @@
 	HMENU	hMenu,
 	UINT	uID)
 {
-	TRACE(shell,"0x%08x 0x%08x\n", hMenu, uID);
+	TRACE("0x%08x 0x%08x\n", hMenu, uID);
 	return 0;
 }
 
@@ -691,7 +691,7 @@
  */
 BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu)
 {
-	TRACE(shell,"0x%08x\n", hMenu);
+	TRACE("0x%08x\n", hMenu);
 	return 0;
 }
 
@@ -703,7 +703,7 @@
 	UINT	uID,
 	BOOL	bEnable)
 {
-	TRACE(shell,"0x%08x 0x%08x 0x%08x\n", hMenu, uID,bEnable);
+	TRACE("0x%08x 0x%08x 0x%08x\n", hMenu, uID,bEnable);
 	return 0;
 }
 
@@ -716,10 +716,10 @@
 DWORD WINAPI FileMenu_GetItemExtent (HMENU hMenu, UINT uPos)
 {	RECT rect;
 	
-	FIXME (shell,"0x%08x 0x%08x\n", hMenu, uPos);
+	FIXME("0x%08x 0x%08x\n", hMenu, uPos);
 
 	if (GetMenuItemRect(0, hMenu, uPos, &rect))
-	{ FIXME (shell,"0x%04x 0x%04x 0x%04x 0x%04x\n",
+	{ FIXME("0x%04x 0x%04x 0x%04x 0x%04x\n",
 	  rect.right, rect.left, rect.top, rect.bottom);
 	  return ((rect.right-rect.left)<<16) + (rect.top-rect.bottom);
 	}
@@ -731,7 +731,7 @@
  *
  */
 void WINAPI FileMenu_AbortInitMenu (void)
-{	TRACE(shell,"\n");
+{	TRACE("\n");
 	bAbortInit = TRUE;
 }
 
@@ -746,7 +746,7 @@
  *  x			[in] no pointer
  */
 HRESULT WINAPI SHFind_InitMenuPopup (HMENU hMenu, HWND hWndParent, DWORD w, DWORD x)
-{	FIXME(shell,"hmenu=0x%08x hwnd=0x%08x 0x%08lx 0x%08lx stub\n",
+{	FIXME("hmenu=0x%08x hwnd=0x%08x 0x%08lx 0x%08lx stub\n",
 		hMenu,hWndParent,w,x);
 	return TRUE;
 }
@@ -782,7 +782,7 @@
 	char		szName[256];
 	UINT		uTemp, uIDMax = uIDAdjust;
 
-	FIXME(shell,"hmenu1=0x%04x hmenu2=0x%04x 0x%04x 0x%04x 0x%04x  0x%04lx stub\n",
+	FIXME("hmenu1=0x%04x hmenu2=0x%04x 0x%04x 0x%04x 0x%04x  0x%04lx stub\n",
 		 hmDst, hmSrc, uInsert, uIDAdjust, uIDAdjustMax, uFlags);
 
 	if (!hmDst || !hmSrc)
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index dc934a8..732671e 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -22,7 +22,7 @@
 
 #include "shresdef.h"
 #include "spy.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 
 #include "docobj.h"
@@ -124,7 +124,7 @@
 	if(pFolder)
 	  IShellFolder_AddRef(pFolder);
 
-	TRACE(shell,"(%p)->(%p pidl=%p)\n",sv, pFolder, pidl);
+	TRACE("(%p)->(%p pidl=%p)\n",sv, pFolder, pidl);
 	shell32_ObjCount++;
 	return (IShellView *) sv;
 }
@@ -138,7 +138,7 @@
 static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl)
 {
 	if ( IsInCommDlg(This) )
-	{ TRACE(shell,"ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
+	{ TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
 	  return (ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl));
 	}
 	return S_OK;
@@ -147,7 +147,7 @@
 static HRESULT OnDefaultCommand(IShellViewImpl * This)
 {
 	if (IsInCommDlg(This))
-	{ TRACE(shell,"ICommDlgBrowser::OnDefaultCommand\n");
+	{ TRACE("ICommDlgBrowser::OnDefaultCommand\n");
 	  return (ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This));
 	}
 	return S_FALSE;
@@ -156,7 +156,7 @@
 static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags)
 {
 	if (IsInCommDlg(This))
-	{ TRACE(shell,"ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
+	{ TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
 	  return (ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags));
 	}
 	return S_FALSE;
@@ -164,7 +164,7 @@
 static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove)
 {	DWORD tmpstyle;
 
-	TRACE(shell,"(%p)\n", This);
+	TRACE("(%p)\n", This);
 
 	tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE);
 	SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
@@ -173,7 +173,7 @@
 static void CheckToolbar(IShellViewImpl * This)
 {	LRESULT result;
 
-	TRACE(shell,"\n");
+	TRACE("\n");
 	
 	IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON,
 		FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result);
@@ -183,7 +183,7 @@
 		FCIDM_TB_SMALLICON, TRUE, &result);
 	IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON,
 		FCIDM_TB_REPORTVIEW, TRUE, &result);
-	TRACE(shell,"--\n");
+	TRACE("--\n");
 }
 
 static void MergeToolBar(IShellViewImpl * This)
@@ -205,20 +205,20 @@
 	  { VIEW_DETAILS    | IN_VIEW_BMP, FCIDM_SHVIEW_REPORTVIEW,	TBSTATE_ENABLED, TBSTYLE_BUTTON, {0,0}, 0L, -1 },
 	} ;
 
-	TRACE(shell,"\n");
+	TRACE("\n");
 
 	ab.hInst = HINST_COMMCTRL;		/* hinstCommctrl */
 	ab.nID   = IDB_STD_SMALL_COLOR;	/* std bitmaps */
 	IShellBrowser_SendControlMsg(This->pShellBrowser,FCW_TOOLBAR,
 				 TB_ADDBITMAP, 8, (LPARAM)&ab, &iStdBMOffset);
 
-	TRACE(shell,"TB_ADDBITMAP returns %lx\n", iStdBMOffset);
+	TRACE("TB_ADDBITMAP returns %lx\n", iStdBMOffset);
 
 	ab.nID   = IDB_VIEW_SMALL_COLOR;	/* std view bitmaps */
 	IShellBrowser_SendControlMsg(This->pShellBrowser,FCW_TOOLBAR,
 				 TB_ADDBITMAP, 8, (LPARAM)&ab, &iViewBMOffset);
 
-	TRACE(shell,"TB_ADDBITMAP returns %lx\n", iViewBMOffset);
+	TRACE("TB_ADDBITMAP returns %lx\n", iViewBMOffset);
 
 	for (i=0; i<6; ++i)
 	{ tbActual[i] = c_tbDefault[i];
@@ -235,7 +235,7 @@
 	IShellBrowser_SetToolbarItems(This->pShellBrowser,tbActual, 6, FCT_MERGE);
 
 	CheckToolbar(This);
-	TRACE(shell,"--\n");
+	TRACE("--\n");
 
 }
 
@@ -247,7 +247,7 @@
 BOOL ShellView_CreateList (IShellViewImpl * This)
 {	DWORD dwStyle;
 
-	TRACE(shell,"%p\n",This);
+	TRACE("%p\n",This);
 
 	dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER |
 		  LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT;
@@ -293,7 +293,7 @@
 {	LVCOLUMNA lvColumn;
 	CHAR        szString[50];
 
-	TRACE(shell,"%p\n",This);
+	TRACE("%p\n",This);
 
 	ListView_DeleteAllItems(This->hWndList);
 
@@ -332,13 +332,13 @@
 */   
 INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
 {	int ret;
-	TRACE(shell,"pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
+	TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData);
 
 	if(!lpData)
 	  return 0;
 	  
 	ret =  (int)((LPSHELLFOLDER)lpData)->lpvtbl->fnCompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2);  
-	TRACE(shell,"ret=%i\n",ret);
+	TRACE("ret=%i\n",ret);
 	return ret;
 }
 
@@ -358,7 +358,7 @@
 	HRESULT		hRes;
 	HDPA		hdpa;
 
-	TRACE(shell,"%p\n",This);
+	TRACE("%p\n",This);
 
 	/* get the itemlist from the shfolder*/  
 	hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
@@ -420,7 +420,7 @@
 *  internal
 */   
 LRESULT ShellView_OnCreate(IShellViewImpl * This)
-{ TRACE(shell,"%p\n",This);
+{ TRACE("%p\n",This);
 
   if(ShellView_CreateList(This))
   {  if(ShellView_InitList(This))
@@ -434,7 +434,7 @@
 *  ShellView_OnSize()
 */   
 LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight)
-{	TRACE(shell,"%p width=%u height=%u\n",This, wWidth,wHeight);
+{	TRACE("%p width=%u height=%u\n",This, wWidth,wHeight);
 
 	/*resize the ListView to fit our window*/
 	if(This->hWndList)
@@ -452,7 +452,7 @@
 	int	nTools,i;
 	HMENU	hSubMenu;
 
-	TRACE(shell,"(%p) semi-stub\n",This);
+	TRACE("(%p) semi-stub\n",This);
 
 	hSubMenu = CreatePopupMenu();
 	if(hSubMenu)
@@ -480,14 +480,14 @@
 	    InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii);
 	  }
 	}
-	TRACE(shell,"-- return (menu=0x%x)\n",hSubMenu);
+	TRACE("-- return (menu=0x%x)\n",hSubMenu);
 	return hSubMenu;
 }
 /**************************************************************************
 * ShellView_MergeFileMenu()
 */   
 void ShellView_MergeFileMenu(IShellViewImpl * This, HMENU hSubMenu)
-{	TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
+{	TRACE("(%p)->(submenu=0x%08x) stub\n",This,hSubMenu);
 
 	if(hSubMenu)
 	{ /*insert This item at the beginning of the menu */
@@ -495,7 +495,7 @@
 	  _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED);
 
 	}
-	TRACE(shell,"--\n");	
+	TRACE("--\n");	
 }
 
 /**************************************************************************
@@ -505,7 +505,7 @@
 void ShellView_MergeViewMenu(IShellViewImpl * This, HMENU hSubMenu)
 {	MENUITEMINFOA	mii;
 
-	TRACE(shell,"(%p)->(submenu=0x%08x)\n",This,hSubMenu);
+	TRACE("(%p)->(submenu=0x%08x)\n",This,hSubMenu);
 
 	if(hSubMenu)
 	{ /*add a separator at the correct position in the menu*/
@@ -530,7 +530,7 @@
 	LPSERVICEPROVIDER pSP;
 	LPDOCKINGWINDOWFRAME pFrame;
 	
-	FIXME(shell,"(%p) stub\n",This);
+	FIXME("(%p) stub\n",This);
 	
 	/*get the browser's IServiceProvider*/
 	hr = IShellBrowser_QueryInterface(This->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
@@ -549,7 +549,7 @@
 * ShellView_UpdateMenu()
 */
 LRESULT ShellView_UpdateMenu(IShellViewImpl * This, HMENU hMenu)
-{	TRACE(shell,"(%p)->(menu=0x%08x)\n",This,hMenu);
+{	TRACE("(%p)->(menu=0x%08x)\n",This,hMenu);
 	CheckMenuItem(hMenu, IDM_VIEW_FILES, MF_BYCOMMAND | (g_bViewKeys ? MF_CHECKED: MF_UNCHECKED));
 
 	if(ShellView_CanDoIDockingWindow(This))
@@ -570,7 +570,7 @@
 *  internal
 */   
 void ShellView_OnDeactivate(IShellViewImpl * This)
-{ TRACE(shell,"%p\n",This);
+{ TRACE("%p\n",This);
   if(This->uState != SVUIA_DEACTIVATE)
   { if(This->hMenu)
     { IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0);
@@ -591,7 +591,7 @@
 	MENUITEMINFOA         mii;
 	CHAR                szText[MAX_PATH];
 
-	TRACE(shell,"%p uState=%x\n",This,uState);    
+	TRACE("%p uState=%x\n",This,uState);    
 
 	/*don't do anything if the state isn't really changing */
 	if(This->uState == uState)
@@ -607,7 +607,7 @@
    
 	  if(This->hMenu)
 	  { IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw);
-	    TRACE(shell,"-- after fnInsertMenusSB\n");    
+	    TRACE("-- after fnInsertMenusSB\n");    
 	    /*build the top level menu get the menu item's text*/
 	    strcpy(szText,"dummy 31");
       
@@ -644,12 +644,12 @@
 	      { ShellView_MergeFileMenu(This, mii.hSubMenu);
 	      }
 	    }
-	  TRACE(shell,"-- before fnSetMenuSB\n");      
+	  TRACE("-- before fnSetMenuSB\n");      
 	  IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd);
 	  }
 	}
 	This->uState = uState;
-	TRACE(shell,"--\n");    
+	TRACE("--\n");    
 	return S_OK;
 }
 
@@ -660,7 +660,7 @@
 *  internal
 */
 LRESULT ShellView_OnSetFocus(IShellViewImpl * This)
-{	TRACE(shell,"%p\n",This);
+{	TRACE("%p\n",This);
 	/* Tell the browser one of our windows has received the focus. This should always 
 	be done before merging menus (OnActivate merges the menus) if one of our 
 	windows has the focus.*/
@@ -674,7 +674,7 @@
 * ShellView_OnKillFocus()
 */   
 LRESULT ShellView_OnKillFocus(IShellViewImpl * This)
-{	TRACE(shell,"(%p) stub\n",This);
+{	TRACE("(%p) stub\n",This);
 	ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS);
 	return 0;
 }
@@ -688,7 +688,7 @@
 	LPSERVICEPROVIDER	pSP;
 	LPDOCKINGWINDOWFRAME	pFrame;
 	
-	WARN(shell,"(%p)->(badd=0x%08x) semi-stub\n",This,bAdd);
+	WARN("(%p)->(badd=0x%08x) semi-stub\n",This,bAdd);
 
 	/* get the browser's IServiceProvider */
 	hr = IShellBrowser_QueryInterface(This->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP);
@@ -698,7 +698,7 @@
 	  if(SUCCEEDED(hr))
 	  { if(bAdd)
 	    { hr = S_OK;
-	      FIXME(shell,"no docking implemented\n");
+	      FIXME("no docking implemented\n");
 #if 0
 	      if(!This->pDockingWindow)
 	      { /* create the toolbar object */
@@ -716,7 +716,7 @@
 #endif
 	    }
 	    else
-	    { FIXME(shell,"no docking implemented\n");
+	    { FIXME("no docking implemented\n");
 #if 0
 	      if(This->pDockingWindow)
 	      { hr = pFrame->lpvtbl->fnRemoveToolbar(pFrame, (IDockingWindow*)This->pDockingWindow, DWFRF_NORMAL);
@@ -743,7 +743,7 @@
 *  ShellView_UpdateShellSettings()
 */
 void ShellView_UpdateShellSettings(IShellViewImpl * This)
-{	FIXME(shell,"(%p) stub\n",This);
+{	FIXME("(%p) stub\n",This);
 	return ;
 /*
 	SHELLFLAGSTATE       sfs;
@@ -784,7 +784,7 @@
 *   ShellView_OnSettingChange()
 */   
 LRESULT ShellView_OnSettingChange(IShellViewImpl * This, LPCSTR lpszSection)
-{	TRACE(shell,"(%p) stub\n",This);
+{	TRACE("(%p) stub\n",This);
 /*if(0 == lstrcmpi(lpszSection, "ShellState"))*/
 	{ ShellView_UpdateShellSettings(This);
 	  return 0;
@@ -795,7 +795,7 @@
 * ShellView_OnCommand()
 */   
 LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd)
-{	TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
+{	TRACE("(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",This, dwCmdID, dwCmd, hwndCmd);
 	switch(dwCmdID)
 	{ case IDM_VIEW_FILES:
 	    g_bViewKeys = ! g_bViewKeys;
@@ -832,7 +832,7 @@
 	    break;
 
 	  default:
-	    TRACE(shell,"-- COMMAND 0x%04lx unhandled\n", dwCmdID);
+	    TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID);
 	}
 	return 0;
 }
@@ -855,10 +855,10 @@
 	This->uSelected = ListView_GetSelectedCount(This->hWndList);
 	This->aSelectedItems = (LPITEMIDLIST*)SHAlloc(This->uSelected * sizeof(LPITEMIDLIST));
 
-	TRACE(shell,"selected=%i\n", This->uSelected);
+	TRACE("selected=%i\n", This->uSelected);
 	
 	if(This->aSelectedItems)
-	{ TRACE(shell,"-- Items selected =%u\n", This->uSelected);
+	{ TRACE("-- Items selected =%u\n", This->uSelected);
 	  ZeroMemory(&lvItem, sizeof(lvItem));
 	  lvItem.mask = LVIF_STATE | LVIF_PARAM;
 	  lvItem.stateMask = LVIS_SELECTED;
@@ -870,7 +870,7 @@
 	  { if(lvItem.state & LVIS_SELECTED)
 	    { This->aSelectedItems[i] = (LPITEMIDLIST)lvItem.lParam;
 	      i++;
-	      TRACE(shell,"-- selected Item found\n");
+	      TRACE("-- selected Item found\n");
 	    }
 	    lvItem.iItem++;
 	  }
@@ -892,7 +892,7 @@
 	LPCONTEXTMENU	pContextMenu = NULL;
 	CMINVOKECOMMANDINFO  cmi;
 	
-	TRACE(shell,"(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, fDefault);
+	TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, fDefault);
 
 	/* look, what's selected and create a context menu object of it*/
 	if(ShellView_GetSelections(This))
@@ -901,7 +901,7 @@
 						    NULL, (LPVOID *)&pContextMenu);
    
 	  if(pContextMenu)
-	  { TRACE(shell,"-- pContextMenu\n");
+	  { TRACE("-- pContextMenu\n");
 	    hMenu = CreatePopupMenu();
 
 	    if( hMenu )
@@ -909,7 +909,7 @@
 	         is present, then we are in Explore mode.*/
         
 	      if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree)
-	      { TRACE(shell,"-- explore mode\n");
+	      { TRACE("-- explore mode\n");
 	        fExplore = TRUE;
 	      }
 
@@ -917,7 +917,7 @@
 
 	      if (SUCCEEDED(pContextMenu->lpvtbl->fnQueryContextMenu( pContextMenu, hMenu, 0, MENU_OFFSET, MENU_MAX, wFlags )))
 	      { if( fDefault )
-	        { TRACE(shell,"-- get menu default command\n");
+	        { TRACE("-- get menu default command\n");
 
 	          uCommand = nMenuIndex = 0;
        	          ZeroMemory(&mii, sizeof(mii));
@@ -933,18 +933,18 @@
 	          }
 	        }
 	        else
-	        { TRACE(shell,"-- track popup\n");
+	        { TRACE("-- track popup\n");
 	          uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
 	        }		
          
 	        if(uCommand > 0)
-	        { TRACE(shell,"-- uCommand=%u\n", uCommand);
+	        { TRACE("-- uCommand=%u\n", uCommand);
 	          if (IsInCommDlg(This) && (((uCommand-MENU_OFFSET)==IDM_EXPLORE) || ((uCommand-MENU_OFFSET)==IDM_OPEN)))
-		  { TRACE(shell,"-- dlg: OnDefaultCommand\n");
+		  { TRACE("-- dlg: OnDefaultCommand\n");
 		    OnDefaultCommand(This);
 		  }
 		  else
-		  { TRACE(shell,"-- explore -- invoke command\n");
+		  { TRACE("-- explore -- invoke command\n");
 		      ZeroMemory(&cmi, sizeof(cmi));
 	              cmi.cbSize = sizeof(cmi);
 	              cmi.hwnd = This->hWndParent;
@@ -978,44 +978,44 @@
 	DWORD dwCursor; 
 	STRRET   str;  
 
-	TRACE(shell,"%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
+	TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code);
 
 	switch(lpnmh->code)
 	{ case NM_SETFOCUS:
-	    TRACE(shell,"-- NM_SETFOCUS %p\n",This);
+	    TRACE("-- NM_SETFOCUS %p\n",This);
 	    ShellView_OnSetFocus(This);
 	    break;
 
 	  case NM_KILLFOCUS:
-	    TRACE(shell,"-- NM_KILLFOCUS %p\n",This);
+	    TRACE("-- NM_KILLFOCUS %p\n",This);
 	    ShellView_OnDeactivate(This);
 	    break;
 
 	  case HDN_ENDTRACKA:
-	    TRACE(shell,"-- HDN_ENDTRACKA %p\n",This);
+	    TRACE("-- HDN_ENDTRACKA %p\n",This);
 	    /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0);
 	    nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/
 	    break;
 
 	  case LVN_DELETEITEM:
-	    TRACE(shell,"-- LVN_DELETEITEM %p\n",This);
+	    TRACE("-- LVN_DELETEITEM %p\n",This);
 	    SHFree((LPITEMIDLIST)lpnmlv->lParam);     /*delete the pidl because we made a copy of it*/
 	    break;
 
 	  case LVN_ITEMACTIVATE:
-	    TRACE(shell,"-- LVN_ITEMACTIVATE %p\n",This);
+	    TRACE("-- LVN_ITEMACTIVATE %p\n",This);
 	    OnStateChange(This, CDBOSC_SELCHANGE);  /* the browser will get the IDataObject now */
 	    ShellView_DoContextMenu(This, 0, 0, TRUE);
 	    break;
 
 	  case NM_RCLICK:
-	    TRACE(shell,"-- NM_RCLICK %p\n",This);
+	    TRACE("-- NM_RCLICK %p\n",This);
 	    dwCursor = GetMessagePos();
 	    ShellView_DoContextMenu(This, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
 	    break;
 
 	  case LVN_GETDISPINFOA:
-	    TRACE(shell,"-- LVN_GETDISPINFOA %p\n",This);
+	    TRACE("-- LVN_GETDISPINFOA %p\n",This);
 	    pidl = (LPITEMIDLIST)lpdi->item.lParam;
 
 
@@ -1058,7 +1058,7 @@
 		      break;
 		  }
 	        }
-	        TRACE(shell,"-- text=%s\n",lpdi->item.pszText);		
+	        TRACE("-- text=%s\n",lpdi->item.pszText);		
 	      }
 	    }
 	    else	   /*the item text is being requested*/
@@ -1072,10 +1072,10 @@
 	          { strncpy(lpdi->item.pszText, str.u.cStr, lpdi->item.cchTextMax);
 	          }
 		  else
-		  { FIXME(shell,"type wrong\n");
+		  { FIXME("type wrong\n");
 		  }
 	        }
-	        TRACE(shell,"-- text=%s\n",lpdi->item.pszText);
+	        TRACE("-- text=%s\n",lpdi->item.pszText);
 	      }
 
 	      if(lpdi->item.mask & LVIF_IMAGE) 		/*is the image being requested?*/
@@ -1085,13 +1085,13 @@
 	    break;
 
 	  case LVN_ITEMCHANGED:
-	    TRACE(shell,"-- LVN_ITEMCHANGED %p\n",This);
+	    TRACE("-- LVN_ITEMCHANGED %p\n",This);
 	    ShellView_GetSelections(This);
 	    OnStateChange(This, CDBOSC_SELCHANGE);  /* the browser will get the IDataObject now */
 	    break;
 
 	  default:
-	    TRACE (shell,"-- %p WM_COMMAND %s unhandled\n", This, SPY_GetMsgName(lpnmh->code));
+	    TRACE("-- %p WM_COMMAND %s unhandled\n", This, SPY_GetMsgName(lpnmh->code));
 	    break;;
 	}
 	return 0;
@@ -1106,11 +1106,11 @@
   LPCREATESTRUCTA lpcs;
   DWORD dwCursor;
   
-  TRACE(shell,"(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
+  TRACE("(hwnd=%x msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
     
   switch (uMessage)
   { case WM_NCCREATE:
-      { TRACE(shell,"-- WM_NCCREATE\n");
+      { TRACE("-- WM_NCCREATE\n");
         lpcs = (LPCREATESTRUCTA)lParam;
         pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
         SetWindowLongA(hWnd, GWL_USERDATA, (LONG)pThis);
@@ -1119,50 +1119,50 @@
       break;
    
    case WM_SIZE:
-      TRACE(shell,"-- WM_SIZE\n");
+      TRACE("-- WM_SIZE\n");
       return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
    
    case WM_SETFOCUS:
-      TRACE(shell,"-- WM_SETFOCUS\n");   
+      TRACE("-- WM_SETFOCUS\n");   
       return ShellView_OnSetFocus(pThis);
  
    case WM_KILLFOCUS:
-      TRACE(shell,"-- WM_KILLFOCUS\n");
+      TRACE("-- WM_KILLFOCUS\n");
   	  return ShellView_OnKillFocus(pThis);
 
    case WM_CREATE:
-      TRACE(shell,"-- WM_CREATE\n");
+      TRACE("-- WM_CREATE\n");
       return ShellView_OnCreate(pThis);
 
    case WM_SHOWWINDOW:
-      TRACE(shell,"-- WM_SHOWWINDOW\n");
+      TRACE("-- WM_SHOWWINDOW\n");
       UpdateWindow(pThis->hWndList);
       break;
 
    case WM_ACTIVATE:
-      TRACE(shell,"-- WM_ACTIVATE\n");
+      TRACE("-- WM_ACTIVATE\n");
       return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
    
    case WM_COMMAND:
-      TRACE(shell,"-- WM_COMMAND\n");
+      TRACE("-- WM_COMMAND\n");
       return ShellView_OnCommand(pThis, GET_WM_COMMAND_ID(wParam, lParam), 
                                   GET_WM_COMMAND_CMD(wParam, lParam), 
                                   GET_WM_COMMAND_HWND(wParam, lParam));
    
    case WM_INITMENUPOPUP:
-      TRACE(shell,"-- WM_INITMENUPOPUP\n");
+      TRACE("-- WM_INITMENUPOPUP\n");
       return ShellView_UpdateMenu(pThis, (HMENU)wParam);
    
    case WM_NOTIFY:
-      TRACE(shell,"-- WM_NOTIFY\n");
+      TRACE("-- WM_NOTIFY\n");
       return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
 
    case WM_SETTINGCHANGE:
-      TRACE(shell,"-- WM_SETTINGCHANGE\n");
+      TRACE("-- WM_SETTINGCHANGE\n");
       return ShellView_OnSettingChange(pThis,(LPCSTR)lParam);
 
    case WM_PARENTNOTIFY:
-      TRACE(shell,"-- WM_PARENTNOTIFY\n");
+      TRACE("-- WM_PARENTNOTIFY\n");
       if ( LOWORD(wParam) == WM_RBUTTONDOWN ) /* fixme: should not be handled here*/
       { dwCursor = GetMessagePos();
 	ShellView_DoContextMenu(pThis, LOWORD(dwCursor), HIWORD(dwCursor), FALSE);
@@ -1171,7 +1171,7 @@
       break;
 
    default:
-      TRACE(shell,"-- message %s unhandled\n", SPY_GetMsgName(uMessage));
+      TRACE("-- message %s unhandled\n", SPY_GetMsgName(uMessage));
       break;
   }
   return DefWindowProcA (hWnd, uMessage, wParam, lParam);
@@ -1191,7 +1191,7 @@
 
 	char    xriid[50];
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	*ppvObj = NULL;
 
@@ -1213,10 +1213,10 @@
 
 	if(*ppvObj)
 	{ IShellView_AddRef( (IShellView*) *ppvObj);
-	  TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
+	  TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
 	  return S_OK;
 	}
-	TRACE(shell,"-- Interface: E_NOINTERFACE\n");
+	TRACE("-- Interface: E_NOINTERFACE\n");
 	return E_NOINTERFACE;
 }
 
@@ -1227,7 +1227,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	shell32_ObjCount++;
 	return ++(This->ref);
@@ -1239,11 +1239,11 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->()\n",This);
+	TRACE("(%p)->()\n",This);
 
 	shell32_ObjCount--;
 	if (!--(This->ref)) 
-	{ TRACE(shell," destroying IShellView(%p)\n",This);
+	{ TRACE(" destroying IShellView(%p)\n",This);
 
 	  if(This->pSFParent)
 	    IShellFolder_Release(This->pSFParent);
@@ -1266,7 +1266,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	*phWnd = This->hWnd;
 
@@ -1277,7 +1277,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	FIXME(shell,"(%p) stub\n",This);
+	FIXME("(%p) stub\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1291,11 +1291,11 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	FIXME(shell,"(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
+	FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
 
 	
 	switch (lpmsg->message)
-	{ case WM_KEYDOWN: 	TRACE(shell,"-- key=0x04%x",lpmsg->wParam) ;
+	{ case WM_KEYDOWN: 	TRACE("-- key=0x04%x",lpmsg->wParam) ;
 	}
 	return S_FALSE;
 }
@@ -1304,7 +1304,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	FIXME(shell,"(%p) stub\n",This);
+	FIXME("(%p) stub\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1317,7 +1317,7 @@
 	LRESULT	lResult;
 	int	nPartArray[1] = {-1};
 
-	TRACE(shell,"(%p)->(state=%x) stub\n",This, uState);
+	TRACE("(%p)->(state=%x) stub\n",This, uState);
 	/*don't do anything if the state isn't really changing*/
 	if(This->uState == uState)
 	{ return S_OK;
@@ -1357,7 +1357,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	ListView_DeleteAllItems(This->hWndList);
 	ShellView_FillList(This);
@@ -1373,8 +1373,8 @@
 	*phWnd = 0;
 
 	
-	TRACE(shell,"(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
-	TRACE(shell,"-- vmode=%x flags=%x left=%i top=%i right=%i bottom=%i\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom);
+	TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd);
+	TRACE("-- vmode=%x flags=%x left=%i top=%i right=%i bottom=%i\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom);
 
 	/*set up the member variables*/
 	This->pShellBrowser = psb;
@@ -1388,7 +1388,7 @@
 	This->pCommDlgBrowser=NULL;
 	if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser, 
 			(REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser)))
-	{ TRACE(shell,"-- CommDlgBrowser\n");
+	{ TRACE("-- CommDlgBrowser\n");
 	}
 	   
 	/*if our window class has not been registered, then do so*/
@@ -1425,7 +1425,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)\n",This);
+	TRACE("(%p)\n",This);
 
 	/*Make absolutely sure all our UI is cleaned up.*/
 	IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE);
@@ -1441,7 +1441,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->(%p) vmode=%x flags=%x\n",This, lpfs, 
+	TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs, 
 		This->FolderSettings.ViewMode, This->FolderSettings.fFlags);
 
 	if (lpfs)
@@ -1456,7 +1456,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	FIXME(shell,"(%p) stub\n",This);
+	FIXME("(%p) stub\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1465,7 +1465,7 @@
 {
 	ICOM_THIS(IShellViewImpl, iface);
 
-	FIXME(shell,"(%p) stub\n",This);
+	FIXME("(%p) stub\n",This);
 
 	return S_OK;
 }
@@ -1473,7 +1473,7 @@
 static HRESULT WINAPI IShellView_fnSelectItem(IShellView * iface, LPCITEMIDLIST pidlItem, UINT uFlags)
 {	ICOM_THIS(IShellViewImpl, iface);
 	
-	FIXME(shell,"(%p)->(pidl=%p, 0x%08x) stub\n",This, pidlItem, uFlags);
+	FIXME("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidlItem, uFlags);
 
 	return E_NOTIMPL;
 }
@@ -1486,7 +1486,7 @@
 	char    xriid[50];
 	
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
-	TRACE(shell,"(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, xriid, ppvOut);
+	TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, xriid, ppvOut);
 
 	*ppvOut = NULL;
 	if(IsEqualIID(riid, &IID_IContextMenu))
@@ -1498,7 +1498,7 @@
 	  pObj =(LPUNKNOWN)IDataObject_Constructor(This->hWndParent, This->pSFParent,This->aSelectedItems,This->uSelected);
 	}
 
-	TRACE(shell,"-- (%p)->(interface=%p)\n",This, ppvOut);
+	TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
 
 	if(!pObj)
 	  return E_OUTOFMEMORY;
@@ -1575,7 +1575,7 @@
 {
 	_ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
 
-	FIXME(shell, "(%p)->(%p 0x%08lx %p %p\n", This, pguidCmdGroup, cCmds, prgCmds, pCmdText);
+	FIXME("(%p)->(%p 0x%08lx %p %p\n", This, pguidCmdGroup, cCmds, prgCmds, pCmdText);
 	return E_NOTIMPL;
 }
 
@@ -1592,7 +1592,7 @@
 {
 	_ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface);
 
-	FIXME(shell, "(%p)->(%p 0x%08lx 0x%08lx %p %p)\n", This, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
+	FIXME("(%p)->(%p 0x%08lx 0x%08lx %p %p)\n", This, pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
 	return E_NOTIMPL;
 }
 
@@ -1621,7 +1621,7 @@
 
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
 
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
 }
@@ -1630,7 +1630,7 @@
 {
 	_ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	return IShellFolder_AddRef((IShellFolder*)This);
 }
@@ -1639,7 +1639,7 @@
 {
 	_ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	return IShellFolder_Release((IShellFolder*)This);
 }
@@ -1654,7 +1654,7 @@
 
 	_ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p, DataObject=%p\n",This,pDataObject);
+	FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject);
 
 	return E_NOTIMPL;
 }
@@ -1667,7 +1667,7 @@
 {
 	_ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1677,7 +1677,7 @@
 {
 	_ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1691,7 +1691,7 @@
 {
 	_ICOM_THIS_From_IDropTarget(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1723,7 +1723,7 @@
 
 	WINE_StringFromCLSID((LPCLSID)riid,xriid);
 
-	TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
+	TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
 
 	return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj);
 }
@@ -1732,7 +1732,7 @@
 {
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	return IShellFolder_AddRef((IShellFolder*)This);
 }
@@ -1741,7 +1741,7 @@
 {
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
+	TRACE("(%p)->(count=%lu)\n",This,This->ref);
 
 	return IShellFolder_Release((IShellFolder*)This);
 }
@@ -1762,7 +1762,7 @@
 
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1778,7 +1778,7 @@
 
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1792,7 +1792,7 @@
 
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1803,7 +1803,7 @@
 
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1816,7 +1816,7 @@
 
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
@@ -1829,7 +1829,7 @@
 
 	_ICOM_THIS_From_IViewObject(IShellViewImpl, iface);
 
-	FIXME(shell, "Stub: This=%p\n",This);
+	FIXME("Stub: This=%p\n",This);
 
 	return E_NOTIMPL;
 }
diff --git a/dlls/winaspi/winaspi16.c b/dlls/winaspi/winaspi16.c
index 45c9bcf..d1983c1 100644
--- a/dlls/winaspi/winaspi16.c
+++ b/dlls/winaspi/winaspi16.c
@@ -13,7 +13,7 @@
 #include "winaspi.h"
 #include "options.h"
 #include "heap.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "selectors.h"
 #include "miscemu.h"
 
@@ -56,19 +56,19 @@
     sprintf(idstr, "scsi c%1dt%1dd%1d", prb->SRB_HaId, prb->SRB_Target, prb->SRB_Lun);
 
     if (!PROFILE_GetWineIniString(idstr, "Device", "", device_str, sizeof(device_str))) {
-	TRACE(aspi, "Trying to open unlisted scsi device %s\n", idstr);
+	TRACE("Trying to open unlisted scsi device %s\n", idstr);
 	return -1;
     }
 
-    TRACE(aspi, "Opening device %s=%s\n", idstr, device_str);
+    TRACE("Opening device %s=%s\n", idstr, device_str);
 
     fd = open(device_str, O_RDWR);
     if (fd == -1) {
 	int save_error = errno;
 #ifdef HAVE_STRERROR
-	ERR(aspi, "Error opening device %s, error '%s'\n", device_str, strerror(save_error));
+	ERR("Error opening device %s, error '%s'\n", device_str, strerror(save_error));
 #else
-    ERR(aspi, "Error opening device %s, error %d\n", device_str, save_error);
+    ERR("Error opening device %s, error %d\n", device_str, save_error);
 #endif
 	return -1;
     }
@@ -110,52 +110,52 @@
 
   switch (prb->CDBByte[0]) {
   case CMD_INQUIRY:
-    TRACE(aspi, "{\n");
-    TRACE(aspi, "\tEVPD: %d\n", prb->CDBByte[1] & 1);
-    TRACE(aspi, "\tLUN: %d\n", (prb->CDBByte[1] & 0xc) >> 1);
-    TRACE(aspi, "\tPAGE CODE: %d\n", prb->CDBByte[2]);
-    TRACE(aspi, "\tALLOCATION LENGTH: %d\n", prb->CDBByte[4]);
-    TRACE(aspi, "\tCONTROL: %d\n", prb->CDBByte[5]);
-    TRACE(aspi, "}\n");
+    TRACE("{\n");
+    TRACE("\tEVPD: %d\n", prb->CDBByte[1] & 1);
+    TRACE("\tLUN: %d\n", (prb->CDBByte[1] & 0xc) >> 1);
+    TRACE("\tPAGE CODE: %d\n", prb->CDBByte[2]);
+    TRACE("\tALLOCATION LENGTH: %d\n", prb->CDBByte[4]);
+    TRACE("\tCONTROL: %d\n", prb->CDBByte[5]);
+    TRACE("}\n");
     break;
   case CMD_SCAN_SCAN:
-    TRACE(aspi, "Transfer Length: %d\n", prb->CDBByte[4]);
+    TRACE("Transfer Length: %d\n", prb->CDBByte[4]);
     break;
   }
 
-  TRACE(aspi, "Host Adapter: %d\n", prb->SRB_HaId);
-  TRACE(aspi, "Flags: %d\n", prb->SRB_Flags);
+  TRACE("Host Adapter: %d\n", prb->SRB_HaId);
+  TRACE("Flags: %d\n", prb->SRB_Flags);
   if (TARGET_TO_HOST(prb)) {
-    TRACE(aspi, "\tData transfer: Target to host. Length checked.\n");
+    TRACE("\tData transfer: Target to host. Length checked.\n");
   }
   else if (HOST_TO_TARGET(prb)) {
-    TRACE(aspi, "\tData transfer: Host to target. Length checked.\n");
+    TRACE("\tData transfer: Host to target. Length checked.\n");
   }
   else if (NO_DATA_TRANSFERED(prb)) {
-    TRACE(aspi, "\tData transfer: none\n");
+    TRACE("\tData transfer: none\n");
   }
   else {
-    WARN(aspi, "\tTransfer by scsi cmd. Length not checked\n");
+    WARN("\tTransfer by scsi cmd. Length not checked\n");
   }
 
-  TRACE(aspi, "\tResidual byte length reporting %s\n", prb->SRB_Flags & 0x4 ? "enabled" : "disabled");
-  TRACE(aspi, "\tLinking %s\n", prb->SRB_Flags & 0x2 ? "enabled" : "disabled");
-  TRACE(aspi, "\tPosting %s\n", prb->SRB_Flags & 0x1 ? "enabled" : "disabled");
-  TRACE(aspi, "Target: %d\n", prb->SRB_Target);
-  TRACE(aspi, "Lun: %d\n", prb->SRB_Lun);
-  TRACE(aspi, "BufLen: %ld\n", prb->SRB_BufLen);
-  TRACE(aspi, "SenseLen: %d\n", prb->SRB_SenseLen);
-  TRACE(aspi, "BufPtr: %lx (%p)\n", prb->SRB_BufPointer, lpBuf);
-  TRACE(aspi, "LinkPointer %lx\n", prb->SRB_Rsvd1);
-  TRACE(aspi, "CDB Length: %d\n", prb->SRB_CDBLen);
-  TRACE(aspi, "POST Proc: %lx\n", (DWORD) prb->SRB_PostProc);
+  TRACE("\tResidual byte length reporting %s\n", prb->SRB_Flags & 0x4 ? "enabled" : "disabled");
+  TRACE("\tLinking %s\n", prb->SRB_Flags & 0x2 ? "enabled" : "disabled");
+  TRACE("\tPosting %s\n", prb->SRB_Flags & 0x1 ? "enabled" : "disabled");
+  TRACE("Target: %d\n", prb->SRB_Target);
+  TRACE("Lun: %d\n", prb->SRB_Lun);
+  TRACE("BufLen: %ld\n", prb->SRB_BufLen);
+  TRACE("SenseLen: %d\n", prb->SRB_SenseLen);
+  TRACE("BufPtr: %lx (%p)\n", prb->SRB_BufPointer, lpBuf);
+  TRACE("LinkPointer %lx\n", prb->SRB_Rsvd1);
+  TRACE("CDB Length: %d\n", prb->SRB_CDBLen);
+  TRACE("POST Proc: %lx\n", (DWORD) prb->SRB_PostProc);
   cdb = &prb->CDBByte[0];
   cmd = prb->CDBByte[0];
   for (i = 0; i < prb->SRB_CDBLen; i++) {
     if (i != 0) dsprintf(aspi, ",");
     dsprintf(aspi, "%02x", *cdb++);
   }
-  TRACE(aspi, "CDB buffer[%s]\n", dbg_str(aspi));
+  TRACE("CDB buffer[%s]\n", dbg_str(aspi));
 }
 
 static void
@@ -170,7 +170,7 @@
     if (i) dsprintf(aspi, ",");
     dsprintf(aspi, "%02x", *cdb++);
   }
-  TRACE(aspi, "SenseArea[%s]\n", dbg_str(aspi));
+  TRACE("SenseArea[%s]\n", dbg_str(aspi));
 }
 
 static void
@@ -192,7 +192,7 @@
 
   switch (prb->CDBByte[0]) {
   case CMD_INQUIRY:
-    TRACE(aspi, "Vendor: '%s'\n", lpBuf + INQUIRY_VENDOR);
+    TRACE("Vendor: '%s'\n", lpBuf + INQUIRY_VENDOR);
     break;
   case CMD_TEST_UNIT_READY:
     ASPI_PrintSenseArea16(prb);
@@ -226,7 +226,7 @@
 
   fd = ASPI_OpenDevice16(lpPRB);
   if (fd == -1) {
-      WARN(aspi, "Failed: could not open device. Device permissions !?\n");
+      WARN("Failed: could not open device. Device permissions !?\n");
       lpPRB->SRB_Status = SS_ERR;
       return SS_ERR;
   }
@@ -249,7 +249,7 @@
   }
 
   if (!lpPRB->SRB_CDBLen) {
-      WARN(aspi, "Failed: lpPRB->SRB_CDBLen = 0.\n");
+      WARN("Failed: lpPRB->SRB_CDBLen = 0.\n");
       lpPRB->SRB_Status = SS_ERR;
       return SS_ERR;
   }
@@ -290,15 +290,15 @@
   if (status < 0 || status != in_len) {
       int save_error = errno;
 
-    WARN(aspi, "Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
+    WARN("Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
     if (status < 0) {
 		if (save_error == ENOMEM) {
-	    MSG("ASPI: Linux generic scsi driver\n  You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n  Suggest 130560\n");
+	    MESSAGE("ASPI: Linux generic scsi driver\n  You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n  Suggest 130560\n");
 	}
 #ifdef HAVE_STRERROR
-		WARN(aspi, "error:= '%s'\n", strerror(save_error));
+		WARN("error:= '%s'\n", strerror(save_error));
 #else
-		WARN(aspi, "error:= %d\n", save_error);
+		WARN("error:= %d\n", save_error);
 #endif
     }
     goto error_exit;
@@ -306,13 +306,13 @@
 
   status = read(fd, sg_reply_hdr, out_len);
   if (status < 0 || status != out_len) {
-    WARN(aspi, "not enough bytes read from scsi device%d\n", status);
+    WARN("not enough bytes read from scsi device%d\n", status);
     goto error_exit;
   }
 
   if (sg_reply_hdr->result != 0) {
     error_code = sg_reply_hdr->result;
-    WARN(aspi, "reply header error (%d)\n", sg_reply_hdr->result);
+    WARN("reply header error (%d)\n", sg_reply_hdr->result);
     goto error_exit;
   }
 
@@ -336,7 +336,7 @@
   /* now do posting */
 
   if (ASPI_POSTING(lpPRB) && lpPRB->SRB_PostProc) {
-    TRACE(aspi, "Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc);
+    TRACE("Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc);
     switch (mode)
     {
       case ASPI_DOS:
@@ -361,17 +361,17 @@
 error_exit:
   if (error_code == EBUSY) {
       lpPRB->SRB_Status = SS_ASPI_IS_BUSY;
-      TRACE(aspi, "Device busy\n");
+      TRACE("Device busy\n");
   }
   else {
-      WARN(aspi, "Failed\n");
+      WARN("Failed\n");
       lpPRB->SRB_Status = SS_ERR;
   }
 
   /* I'm not sure exactly error codes work here
    * We probably should set lpPRB->SRB_TargStat, SRB_HaStat ?
    */
-  WARN(aspi, "error_exit\n");
+  WARN("error_exit\n");
   free(sg_reply_hdr);
   free(sg_hd);
   return lpPRB->SRB_Status;
@@ -386,7 +386,7 @@
 WORD WINAPI GetASPISupportInfo16()
 {
 #ifdef linux
-    TRACE(aspi, "GETASPISupportInfo16\n");
+    TRACE("GETASPISupportInfo16\n");
     /* high byte SS_COMP - low byte number of host adapters */
     return ((SS_COMP << 8) | HA_Count);
 #else
@@ -425,7 +425,7 @@
   case SC_HA_INQUIRY:
     lpSRB->inquiry.SRB_Status = SS_COMP;       /* completed successfully */
     if (lpSRB->inquiry.SRB_55AASignature == 0x55aa) {
-	TRACE(aspi, "Extended request detected (Adaptec's ASPIxDOS).\nWe don't support it at the moment.\n");
+	TRACE("Extended request detected (Adaptec's ASPIxDOS).\nWe don't support it at the moment.\n");
     }
     lpSRB->inquiry.SRB_ExtBufferSize = 0x2000; /* bogus value */
     lpSRB->inquiry.HA_Count = HA_Count;
@@ -435,19 +435,19 @@
 adapter name */
     memset(lpSRB->inquiry.HA_Unique, 0, 16); /* default HA_Unique content */
     lpSRB->inquiry.HA_Unique[6] = 0x02; /* Maximum Transfer Length (128K, Byte> 4-7) */
-    FIXME(aspi, "ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId);
+    FIXME("ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId);
     return SS_COMP;
   case SC_GET_DEV_TYPE:
-    FIXME(aspi, "Not implemented SC_GET_DEV_TYPE\n");
+    FIXME("Not implemented SC_GET_DEV_TYPE\n");
     break;
   case SC_EXEC_SCSI_CMD:
     return ASPI_ExecScsiCmd((DWORD)ptrSRB, mode);
     break;
   case SC_RESET_DEV:
-    FIXME(aspi, "Not implemented SC_RESET_DEV\n");
+    FIXME("Not implemented SC_RESET_DEV\n");
     break;
   default:
-    FIXME(aspi, "Unknown command %d\n", lpSRB->common.SRB_Cmd);
+    FIXME("Unknown command %d\n", lpSRB->common.SRB_Cmd);
   }
 #endif
   return SS_INVALID_SRB;
@@ -531,7 +531,7 @@
 	if ((CX_reg(context) == 4) || (CX_reg(context) == 5))
 	{
 	*p = DPMI_AllocInternalRMCB(ASPI_DOS_func);
-	TRACE(aspi, "allocated real mode proc %p\n", *p);
+	TRACE("allocated real mode proc %p\n", *p);
 	    AX_reg(context) = CX_reg(context);
 	}
 	else
diff --git a/dlls/wnaspi32/winaspi32.c b/dlls/wnaspi32/winaspi32.c
index 75db238..30d11f0 100644
--- a/dlls/wnaspi32/winaspi32.c
+++ b/dlls/wnaspi32/winaspi32.c
@@ -13,7 +13,7 @@
 #include "wnaspi32.h"
 #include "options.h"
 #include "heap.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(aspi)
 
@@ -50,19 +50,19 @@
     sprintf(idstr, "scsi c%1dt%1dd%1d", prb->SRB_HaId, prb->SRB_Target, prb->SRB_Lun);
 
     if (!PROFILE_GetWineIniString(idstr, "Device", "", device_str, sizeof(device_str))) {
-	TRACE(aspi, "Trying to open unlisted scsi device %s\n", idstr);
+	TRACE("Trying to open unlisted scsi device %s\n", idstr);
 	return -1;
     }
 
-    TRACE(aspi, "Opening device %s=%s\n", idstr, device_str);
+    TRACE("Opening device %s=%s\n", idstr, device_str);
 
     fd = open(device_str, O_RDWR);
     if (fd == -1) {
 	int save_error = errno;
 #ifdef HAVE_STRERROR
-    ERR(aspi, "Error opening device %s, error '%s'\n", device_str, strerror(save_error));
+    ERR("Error opening device %s, error '%s'\n", device_str, strerror(save_error));
 #else
-    ERR(aspi, "Error opening device %s, error %d\n", device_str, save_error);
+    ERR("Error opening device %s, error %d\n", device_str, save_error);
 #endif
 	return -1;
     }
@@ -91,51 +91,51 @@
 
   switch (prb->CDBByte[0]) {
   case CMD_INQUIRY:
-    TRACE(aspi, "{\n");
-    TRACE(aspi, "\tEVPD: %d\n", prb->CDBByte[1] & 1);
-    TRACE(aspi, "\tLUN: %d\n", (prb->CDBByte[1] & 0xc) >> 1);
-    TRACE(aspi, "\tPAGE CODE: %d\n", prb->CDBByte[2]);
-    TRACE(aspi, "\tALLOCATION LENGTH: %d\n", prb->CDBByte[4]);
-    TRACE(aspi, "\tCONTROL: %d\n", prb->CDBByte[5]);
-    TRACE(aspi, "}\n");
+    TRACE("{\n");
+    TRACE("\tEVPD: %d\n", prb->CDBByte[1] & 1);
+    TRACE("\tLUN: %d\n", (prb->CDBByte[1] & 0xc) >> 1);
+    TRACE("\tPAGE CODE: %d\n", prb->CDBByte[2]);
+    TRACE("\tALLOCATION LENGTH: %d\n", prb->CDBByte[4]);
+    TRACE("\tCONTROL: %d\n", prb->CDBByte[5]);
+    TRACE("}\n");
     break;
   case CMD_SCAN_SCAN:
-    TRACE(aspi, "Transfer Length: %d\n", prb->CDBByte[4]);
+    TRACE("Transfer Length: %d\n", prb->CDBByte[4]);
     break;
   }
 
-  TRACE(aspi, "Host Adapter: %d\n", prb->SRB_HaId);
-  TRACE(aspi, "Flags: %d\n", prb->SRB_Flags);
+  TRACE("Host Adapter: %d\n", prb->SRB_HaId);
+  TRACE("Flags: %d\n", prb->SRB_Flags);
   if (TARGET_TO_HOST(prb)) {
-    TRACE(aspi, "\tData transfer: Target to host. Length checked.\n");
+    TRACE("\tData transfer: Target to host. Length checked.\n");
   }
   else if (HOST_TO_TARGET(prb)) {
-    TRACE(aspi, "\tData transfer: Host to target. Length checked.\n");
+    TRACE("\tData transfer: Host to target. Length checked.\n");
   }
   else if (NO_DATA_TRANSFERED(prb)) {
-    TRACE(aspi, "\tData transfer: none\n");
+    TRACE("\tData transfer: none\n");
   }
   else {
-    WARN(aspi, "\tTransfer by scsi cmd. Length not checked.\n");
+    WARN("\tTransfer by scsi cmd. Length not checked.\n");
   }
 
-  TRACE(aspi, "\tResidual byte length reporting %s\n", prb->SRB_Flags & 0x4 ? "enabled" : "disabled");
-  TRACE(aspi, "\tLinking %s\n", prb->SRB_Flags & 0x2 ? "enabled" : "disabled");
-  TRACE(aspi, "\tPosting %s\n", prb->SRB_Flags & 0x1 ? "enabled" : "disabled");
-  TRACE(aspi, "Target: %d\n", prb->SRB_Target);
-  TRACE(aspi, "Lun: %d\n", prb->SRB_Lun);
-  TRACE(aspi, "BufLen: %ld\n", prb->SRB_BufLen);
-  TRACE(aspi, "SenseLen: %d\n", prb->SRB_SenseLen);
-  TRACE(aspi, "BufPtr: %p\n", prb->SRB_BufPointer);
-  TRACE(aspi, "CDB Length: %d\n", prb->SRB_CDBLen);
-  TRACE(aspi, "POST Proc: %lx\n", (DWORD) prb->SRB_PostProc);
+  TRACE("\tResidual byte length reporting %s\n", prb->SRB_Flags & 0x4 ? "enabled" : "disabled");
+  TRACE("\tLinking %s\n", prb->SRB_Flags & 0x2 ? "enabled" : "disabled");
+  TRACE("\tPosting %s\n", prb->SRB_Flags & 0x1 ? "enabled" : "disabled");
+  TRACE("Target: %d\n", prb->SRB_Target);
+  TRACE("Lun: %d\n", prb->SRB_Lun);
+  TRACE("BufLen: %ld\n", prb->SRB_BufLen);
+  TRACE("SenseLen: %d\n", prb->SRB_SenseLen);
+  TRACE("BufPtr: %p\n", prb->SRB_BufPointer);
+  TRACE("CDB Length: %d\n", prb->SRB_CDBLen);
+  TRACE("POST Proc: %lx\n", (DWORD) prb->SRB_PostProc);
   cdb = &prb->CDBByte[0];
   cmd = prb->CDBByte[0];
   for (i = 0; i < prb->SRB_CDBLen; i++) {
     if (i != 0) dsprintf(aspi, ",");
     dsprintf(aspi, "%02x", *cdb++);
   }
-  TRACE(aspi, "CDB buffer[%s]\n", dbg_str(aspi));
+  TRACE("CDB buffer[%s]\n", dbg_str(aspi));
 }
 
 static void
@@ -150,7 +150,7 @@
     if (i) dsprintf(aspi, ",");
     dsprintf(aspi, "%02x", *cdb++);
   }
-  TRACE(aspi, "SenseArea[%s]\n", dbg_str(aspi));
+  TRACE("SenseArea[%s]\n", dbg_str(aspi));
 }
 
 static void
@@ -159,7 +159,7 @@
 
   switch (prb->CDBByte[0]) {
   case CMD_INQUIRY:
-    TRACE(aspi, "Vendor: '%s'\n", prb->SRB_BufPointer + INQUIRY_VENDOR);
+    TRACE("Vendor: '%s'\n", prb->SRB_BufPointer + INQUIRY_VENDOR);
     break;
   case CMD_TEST_UNIT_READY:
     ASPI_PrintSenseArea(prb);
@@ -180,7 +180,7 @@
 
   fd = ASPI_OpenDevice(lpPRB);
   if (fd == -1) {
-      ERR(aspi, "Failed: could not open device c%01dt%01dd%01d. Device permissions !?\n",
+      ERR("Failed: could not open device c%01dt%01dd%01d. Device permissions !?\n",
 	  lpPRB->SRB_HaId,lpPRB->SRB_Target,lpPRB->SRB_Lun);
       lpPRB->SRB_Status = SS_NO_DEVICE;
       return SS_NO_DEVICE;
@@ -192,7 +192,7 @@
   lpPRB->SRB_Status = SS_PENDING;
 
   if (!lpPRB->SRB_CDBLen) {
-      WARN(aspi, "Failed: lpPRB->SRB_CDBLen = 0.\n");
+      WARN("Failed: lpPRB->SRB_CDBLen = 0.\n");
       lpPRB->SRB_Status = SS_ERR;
       return SS_ERR;
   }
@@ -233,15 +233,15 @@
   if (status < 0 || status != in_len) {
       int save_error = errno;
 
-    WARN(aspi, "Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
+    WARN("Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
     if (status < 0) {
 		if (save_error == ENOMEM) {
-	    MSG("ASPI: Linux generic scsi driver\n  You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n  Suggest 130560\n");
+	    MESSAGE("ASPI: Linux generic scsi driver\n  You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n  Suggest 130560\n");
 	}
 #ifdef HAVE_STRERROR
-		WARN(aspi, "error:= '%s'\n", strerror(save_error));
+		WARN("error:= '%s'\n", strerror(save_error));
 #else
-		WARN(aspi, "error:= %d\n", save_error);
+		WARN("error:= %d\n", save_error);
 #endif
     }
     goto error_exit;
@@ -249,13 +249,13 @@
 
   status = read(fd, sg_reply_hdr, out_len);
   if (status < 0 || status != out_len) {
-    WARN(aspi, "not enough bytes read from scsi device%d\n", status);
+    WARN("not enough bytes read from scsi device%d\n", status);
     goto error_exit;
   }
 
   if (sg_reply_hdr->result != 0) {
     error_code = sg_reply_hdr->result;
-    WARN(aspi, "reply header error (%d)\n", sg_reply_hdr->result);
+    WARN("reply header error (%d)\n", sg_reply_hdr->result);
     goto error_exit;
   }
 
@@ -280,12 +280,12 @@
 
   if (lpPRB->SRB_PostProc) {
     if (ASPI_POSTING(lpPRB)) {
-      TRACE(aspi, "Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc);
+      TRACE("Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc);
       (*lpPRB->SRB_PostProc)(lpPRB);
     }
     else
     if (lpPRB->SRB_Flags & SRB_EVENT_NOTIFY) {
-      TRACE(aspi, "Setting event %04x\n", (HANDLE)lpPRB->SRB_PostProc);
+      TRACE("Setting event %04x\n", (HANDLE)lpPRB->SRB_PostProc);
       SetEvent((HANDLE)lpPRB->SRB_PostProc); /* FIXME: correct ? */
     }
   }
@@ -297,17 +297,17 @@
 error_exit:
   if (error_code == EBUSY) {
       lpPRB->SRB_Status = SS_ASPI_IS_BUSY;
-      TRACE(aspi, "Device busy\n");
+      TRACE("Device busy\n");
   }
   else {
-      WARN(aspi, "Failed\n");
+      WARN("Failed\n");
       lpPRB->SRB_Status = SS_ERR;
   }
 
   /* I'm not sure exactly error codes work here
    * We probably should set lpPRB->SRB_TargStat, SRB_HaStat ?
    */
-  WARN(aspi, "error_exit\n");
+  WARN("error_exit\n");
   free(sg_reply_hdr);
   free(sg_hd);
   return lpPRB->SRB_Status;
@@ -346,19 +346,19 @@
     strcat(lpSRB->inquiry.HA_Identifier, "Wine host"); /* FIXME: return host adapter name */
     memset(lpSRB->inquiry.HA_Unique, 0, 16); /* default HA_Unique content */
     lpSRB->inquiry.HA_Unique[6] = 0x02; /* Maximum Transfer Length (128K, Byte> 4-7) */
-    FIXME(aspi, "ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId);
+    FIXME("ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId);
     return SS_COMP;
   case SC_GET_DEV_TYPE:
-    FIXME(aspi, "Not implemented SC_GET_DEV_TYPE\n");
+    FIXME("Not implemented SC_GET_DEV_TYPE\n");
     break;
   case SC_EXEC_SCSI_CMD:
     return ASPI_ExecScsiCmd(&lpSRB->cmd);
     break;
   case SC_RESET_DEV:
-    FIXME(aspi, "Not implemented SC_RESET_DEV\n");
+    FIXME("Not implemented SC_RESET_DEV\n");
     break;
   default:
-    WARN(aspi, "Unknown command %d\n", lpSRB->common.SRB_Cmd);
+    WARN("Unknown command %d\n", lpSRB->common.SRB_Cmd);
   }
   return SS_INVALID_SRB;
 #else
diff --git a/if1632/builtin.c b/if1632/builtin.c
index 421fbca..67fac62 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -21,7 +21,7 @@
 #include "process.h"
 #include "snoop.h"
 #include "task.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "toolhelp.h"
 
 DEFAULT_DEBUG_CHANNEL(module)
@@ -165,7 +165,7 @@
     if (!hModule) return 0;
     FarSetOwner16( hModule, hModule );
 
-    TRACE(module, "Built-in %s: hmodule=%04x\n",
+    TRACE("Built-in %s: hmodule=%04x\n",
                     descr->name, hModule );
     pModule = (NE_MODULE *)GlobalLock16( hModule );
     pModule->self = hModule;
diff --git a/if1632/dummy.c b/if1632/dummy.c
index 9fc3695..8af0fb2 100644
--- a/if1632/dummy.c
+++ b/if1632/dummy.c
@@ -3,53 +3,53 @@
  */
 
 #include "windef.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(relay)
 
-long WINAPI stub_GDI_379(HDC16 hdc) { FIXME(relay, "STARTPAGE: stub\n"); return 1; }
-long WINAPI stub_GDI_381(HDC16 hdc, SEGPTR proc) { FIXME(relay, "SETABORTPROC: stub\n"); return 1; }
-long WINAPI stub_GDI_382(void) { FIXME(relay, "ABORTPROC: stub\n"); return 1; }
-long WINAPI stub_GDI_530(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_531(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_379(HDC16 hdc) { FIXME("STARTPAGE: stub\n"); return 1; }
+long WINAPI stub_GDI_381(HDC16 hdc, SEGPTR proc) { FIXME("SETABORTPROC: stub\n"); return 1; }
+long WINAPI stub_GDI_382(void) { FIXME("ABORTPROC: stub\n"); return 1; }
+long WINAPI stub_GDI_530(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_531(void) { FIXME("stub\n"); return 0; }
 long WINAPI stub_GDI_532(LPINT16 buffer, INT16 xx) { 
-      FIXME(relay, "(%p, %hd): stub\n",buffer,xx); 
+      FIXME("(%p, %hd): stub\n",buffer,xx); 
       return 0; 
 }
-long WINAPI stub_GDI_536(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_538(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_540(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_543(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_555(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_560(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_561(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_564(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_565(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_566(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_571(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_572(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_573(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_556(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_558(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_GDI_569(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_489(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_490(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_492(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_496(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_902(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_905(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_906(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_907(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_909(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_910(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_911(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_912(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_913(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_914(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_915(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_916(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_918(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_919(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_920(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_922(void) { FIXME(relay, "stub\n"); return 0; }
-long WINAPI stub_USER_923(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_536(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_538(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_540(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_543(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_555(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_560(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_561(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_564(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_565(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_566(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_571(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_572(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_573(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_556(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_558(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_GDI_569(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_489(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_490(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_492(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_496(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_902(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_905(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_906(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_907(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_909(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_910(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_911(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_912(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_913(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_914(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_915(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_916(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_918(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_919(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_920(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_922(void) { FIXME("stub\n"); return 0; }
+long WINAPI stub_USER_923(void) { FIXME("stub\n"); return 0; }
diff --git a/if1632/relay.c b/if1632/relay.c
index e21bbd3..508e628 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -14,7 +14,7 @@
 #include "stackframe.h"
 #include "task.h"
 #include "debugstr.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "main.h"
 
 DEFAULT_DEBUG_CHANNEL(relay)
@@ -243,7 +243,7 @@
 {
     WORD ordinal;
     STACK16FRAME *frame = CURRENT_STACK16;
-    MSG("No handler for Win16 routine %s (called from %04x:%04x)\n",
+    MESSAGE("No handler for Win16 routine %s (called from %04x:%04x)\n",
             BUILTIN_GetEntryPoint16(frame->entry_cs,frame->entry_ip,&ordinal),
             frame->cs, frame->ip );
     ExitProcess(1);
@@ -413,7 +413,7 @@
     DS_reg(context) = lpbuf[6];
 
     if (lpbuf[8] != SS_reg(context))
-        ERR(relay, "Switching stack segment with Throw() not supported; expect crash now\n" );
+        ERR("Switching stack segment with Throw() not supported; expect crash now\n" );
 
     if (TRACE_ON(relay))  /* Make sure we have a valid entry point address */
     {
@@ -502,7 +502,7 @@
 		break;
 	default:
 		/* FIXME: should go up to 32  arguments */
-		ERR(relay,"Unsupported number of arguments %ld, please report.\n",nrofargs);
+		ERR("Unsupported number of arguments %ld, please report.\n",nrofargs);
 		ret = 0;
 		break;
 	}
@@ -510,7 +510,7 @@
         if (!Ex) STACK16_POP( THREAD_Current(),
                               (3 + nrofargs) * sizeof(DWORD) );
 
-	TRACE(relay,"%s - returns %08lx\n",dbg_str(relay),ret);
+	TRACE("%s - returns %08lx\n",dbg_str(relay),ret);
 	HeapFree( GetProcessHeap(), 0, args );
 
 	SYSLEVEL_RestoreWin16Lock();
diff --git a/if1632/snoop.c b/if1632/snoop.c
index 41989f334..e2be0bc 100644
--- a/if1632/snoop.c
+++ b/if1632/snoop.c
@@ -14,7 +14,7 @@
 #include "stackframe.h"
 #include "snoop.h"
 #include "debugstr.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(snoop)
 
@@ -130,7 +130,7 @@
 	(*dll)->funs = GlobalLock16((*dll)->funhandle);
 	if (!(*dll)->funs) {
 		HeapFree(SystemHeap,0,*dll);
-		FIXME(snoop,"out of memory\n");
+		FIXME("out of memory\n");
 		return;
 	}
 	memset((*dll)->funs,0,65535);
@@ -228,7 +228,7 @@
 		dll=dll->next;
 	}
 	if (!dll) {
-		FIXME(snoop,"entrypoint 0x%08lx not found\n",entry);
+		FIXME("entrypoint 0x%08lx not found\n",entry);
 		return; /* oops */
 	}
 	while (*rets) {
@@ -317,7 +317,7 @@
 }
 #else	/* !__i386__ */
 void SNOOP16_RegisterDLL(NE_MODULE *pModule,LPCSTR name) {
-	FIXME(snoop,"snooping works only on i386 for now.\n");
+	FIXME("snooping works only on i386 for now.\n");
 	return;
 }
 
diff --git a/loader/dos/module.c b/loader/dos/module.c
index fc54af1..4a34576 100644
--- a/loader/dos/module.c
+++ b/loader/dos/module.c
@@ -28,7 +28,7 @@
 #include "ldt.h"
 #include "process.h"
 #include "miscemu.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "dosexe.h"
 #include "dosmod.h"
 #include "options.h"
@@ -194,7 +194,7 @@
  tmpnam(lpDosTask->mm_name);
 /* strcpy(lpDosTask->mm_name,"/tmp/mydosimage"); */
  lpDosTask->mm_fd=open(lpDosTask->mm_name,O_RDWR|O_CREAT /* |O_TRUNC */,S_IRUSR|S_IWUSR);
- if (lpDosTask->mm_fd<0) ERR(module,"file %s could not be opened\n",lpDosTask->mm_name);
+ if (lpDosTask->mm_fd<0) ERR("file %s could not be opened\n",lpDosTask->mm_name);
  /* expand file to 1MB+64K */
  lseek(lpDosTask->mm_fd,0x110000-1,SEEK_SET);
  x=0; write(lpDosTask->mm_fd,&x,1);
@@ -202,14 +202,14 @@
  lpDosTask->img=mmap(NULL,0x110000-START_OFFSET,PROT_READ|PROT_WRITE,MAP_SHARED,lpDosTask->mm_fd,0);
 #endif
  if (lpDosTask->img==(LPVOID)-1) {
-  ERR(module,"could not map shared memory, error=%s\n",strerror(errno));
+  ERR("could not map shared memory, error=%s\n",strerror(errno));
   return FALSE;
  }
- TRACE(module,"DOS VM86 image mapped at %08lx\n",(DWORD)lpDosTask->img);
+ TRACE("DOS VM86 image mapped at %08lx\n",(DWORD)lpDosTask->img);
  pModule->dos_image=lpDosTask->img;
 
  /* initialize the memory */
- TRACE(module,"Initializing DOS memory structures\n");
+ TRACE("Initializing DOS memory structures\n");
  DOSMEM_Init(lpDosTask->hModule);
  MZ_InitHandlers(lpDosTask);
  MZ_InitXMS(lpDosTask);
@@ -253,17 +253,17 @@
  env_seg=MZ_InitEnvironment(lpDosTask,env,ofs->szPathName);
 
  /* allocate memory for the executable */
- TRACE(module,"Allocating DOS memory (min=%ld, max=%ld)\n",min_size,max_size);
+ TRACE("Allocating DOS memory (min=%ld, max=%ld)\n",min_size,max_size);
  avail=DOSMEM_Available(lpDosTask->hModule);
  if (avail<min_size) {
-  ERR(module, "insufficient DOS memory\n");
+  ERR("insufficient DOS memory\n");
   SetLastError(ERROR_NOT_ENOUGH_MEMORY);
   return FALSE;
  }
  if (avail>max_size) avail=max_size;
  psp_start=DOSMEM_GetBlock(lpDosTask->hModule,avail,&lpDosTask->psp_seg);
  if (!psp_start) {
-  ERR(module, "error allocating DOS memory\n");
+  ERR("error allocating DOS memory\n");
   SetLastError(ERROR_NOT_ENOUGH_MEMORY);
   return FALSE;
  }
@@ -272,7 +272,7 @@
  MZ_InitPSP(psp_start, cmdline, env_seg);
 
  /* load executable image */
- TRACE(module,"loading DOS %s image, %08lx bytes\n",old_com?"COM":"EXE",image_size);
+ TRACE("loading DOS %s image, %08lx bytes\n",old_com?"COM":"EXE",image_size);
  _llseek(hFile,image_start,FILE_BEGIN);
  if ((_lread(hFile,load_start,image_size)) != image_size) {
   SetLastError(ERROR_BAD_FORMAT);
@@ -281,7 +281,7 @@
 
  if (mz_header.e_crlc) {
   /* load relocation table */
-  TRACE(module,"loading DOS EXE relocation table, %d entries\n",mz_header.e_crlc);
+  TRACE("loading DOS EXE relocation table, %d entries\n",mz_header.e_crlc);
   /* FIXME: is this too slow without read buffering? */
   _llseek(hFile,mz_header.e_lfarlc,FILE_BEGIN);
   for (x=0; x<mz_header.e_crlc; x++) {
@@ -298,7 +298,7 @@
  lpDosTask->init_ss=lpDosTask->load_seg+mz_header.e_ss;
  lpDosTask->init_sp=mz_header.e_sp;
 
- TRACE(module,"entry point: %04x:%04x\n",lpDosTask->init_cs,lpDosTask->init_ip);
+ TRACE("entry point: %04x:%04x\n",lpDosTask->init_cs,lpDosTask->init_ip);
  return TRUE;
 }
 
@@ -364,9 +364,9 @@
   CLIENT_SendRequest( REQ_GET_WRITE_FD, -1, 1, &w_req, sizeof(w_req) );
   CLIENT_WaitReply( NULL, &x_fd, 0 );
 
-  TRACE(module,"win32 pipe: read=%d, write=%d, unix pipe: read=%d, write=%d\n",
+  TRACE("win32 pipe: read=%d, write=%d, unix pipe: read=%d, write=%d\n",
 	       lpDosTask->hReadPipe,lpDosTask->hXPipe,lpDosTask->read_pipe,x_fd);
-  TRACE(module,"outbound unix pipe: read=%d, write=%d, pid=%d\n",write_fd[0],write_fd[1],getpid());
+  TRACE("outbound unix pipe: read=%d, write=%d, pid=%d\n",write_fd[0],write_fd[1],getpid());
 
   lpDosTask->write_pipe=write_fd[1];
 
@@ -382,7 +382,7 @@
     fname=fproc; farg=arg;
   }
 
-  TRACE(module,"Loading DOS VM support module (hmodule=%04x)\n",lpDosTask->hModule);
+  TRACE("Loading DOS VM support module (hmodule=%04x)\n",lpDosTask->hModule);
   if ((child=fork())<0) {
     close(write_fd[0]);
     close(lpDosTask->read_pipe);
@@ -404,7 +404,7 @@
     if (read(lpDosTask->read_pipe,&ret,sizeof(ret))==sizeof(ret)) break;
     if ((errno==EINTR)||(errno==EAGAIN)) continue;
     /* failure */
-    ERR(module,"dosmod has failed to initialize\n");
+    ERR("dosmod has failed to initialize\n");
     if (lpDosTask->mm_name[0]!=0) unlink(lpDosTask->mm_name);
     return FALSE;
   }
@@ -414,8 +414,8 @@
   /* start simulated system timer */
   MZ_InitTimer(lpDosTask,ret);
   if (ret<2) {
-    ERR(module,"dosmod version too old! Please install newer dosmod properly\n");
-    ERR(module,"If you don't, the new dosmod event handling system will not work\n");
+    ERR("dosmod version too old! Please install newer dosmod properly\n");
+    ERR("If you don't, the new dosmod event handling system will not work\n");
   }
   /* all systems are now go */
  } else {
@@ -444,7 +444,7 @@
   /* and, just for completeness... */
   execl("loader/dos/dosmod",fname,farg,NULL);
   /* if failure, exit */
-  ERR(module,"Failed to spawn dosmod, error=%s\n",strerror(errno));
+  ERR("Failed to spawn dosmod, error=%s\n",strerror(errno));
   exit(1);
  }
  return TRUE;
@@ -512,7 +512,7 @@
   DOSEVENT *event,*p_event;
   DOSSYSTEM *sys,*p_sys;
 
-  TRACE(module,"killing DOS task\n");
+  TRACE("killing DOS task\n");
   if (lpDosTask->mm_name[0]!=0) {
     munmap(lpDosTask->img,0x110000-START_OFFSET);
     close(lpDosTask->mm_fd);
@@ -563,7 +563,7 @@
                        BOOL inherit, DWORD flags, LPSTARTUPINFOA startup,
                        LPPROCESS_INFORMATION info )
 {
- WARN(module,"DOS executables not supported on this architecture\n");
+ WARN("DOS executables not supported on this architecture\n");
  SetLastError(ERROR_BAD_FORMAT);
  return FALSE;
 }
diff --git a/loader/elf.c b/loader/elf.c
index 6342d40..d4ba4e9 100644
--- a/loader/elf.c
+++ b/loader/elf.c
@@ -23,7 +23,7 @@
 #include "heap.h"
 #include "module.h"
 #include "pe_image.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "winerror.h"
 #include "elfdll.h"
 
@@ -162,7 +162,7 @@
 
 	assert(wm->type == MODULE32_ELF);
 	if (!HIWORD(funcName)) {
-		ERR(win32,"Can't import from UNIX dynamic libs by ordinal, sorry.\n");
+		ERR("Can't import from UNIX dynamic libs by ordinal, sorry.\n");
 		return (FARPROC)0;
 	}
 	fun = dlsym(wm->binfmt.elf.dlhandle,funcName);
@@ -204,7 +204,7 @@
 		stub++;
 	}
 	if (i==STUBSIZE/sizeof(ELF_STDCALL_STUB)) {
-		ERR(win32,"please report, that there are not enough slots for stdcall stubs in the ELF loader.\n");
+		ERR("please report, that there are not enough slots for stdcall stubs in the ELF loader.\n");
 		assert(i<STUBSIZE/sizeof(ELF_STDCALL_STUB));
 	}
 	if (!stub->origfun)
@@ -247,7 +247,7 @@
 		fun=(FARPROC)stub;
 	}
 	if (!fun) {
-		FIXME(win32,"function %s not found: %s\n",funcName,dlerror());
+		FIXME("function %s not found: %s\n",funcName,dlerror());
 		return fun;
 	}
 	fun = SNOOP_GetProcAddress(wm->module,funcName,stub-wm->binfmt.elf.stubs,fun);
diff --git a/loader/libres.c b/loader/libres.c
index 79b4cbb..a1727c4 100644
--- a/loader/libres.c
+++ b/loader/libres.c
@@ -8,7 +8,7 @@
 #include "wine/winestring.h"
 #include "libres.h"
 #include "resource.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "heap.h"
 #include "xmalloc.h"
 
@@ -67,7 +67,7 @@
     }
     else
     {
-      TRACE(resource, "(*,*,type=string): Returning 0\n");
+      TRACE("(*,*,type=string): Returning 0\n");
       return 0;
     }
   }
diff --git a/loader/loadorder.c b/loader/loadorder.c
index d8a19a8..0784f68 100644
--- a/loader/loadorder.c
+++ b/loader/loadorder.c
@@ -16,7 +16,7 @@
 #include "options.h"
 #include "module.h"
 #include "elfdll.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(module)
 
@@ -130,7 +130,7 @@
 
 		if(n >= MODULE_LOADORDER_NTYPES)
 		{
-			ERR(module, "More than existing %d module-types specified, rest ignored", MODULE_LOADORDER_NTYPES);
+			ERR("More than existing %d module-types specified, rest ignored", MODULE_LOADORDER_NTYPES);
 			break;
 		}
 
@@ -149,7 +149,7 @@
 		case 'b': type = MODULE_LOADORDER_BI; break;
 
 		default:
-			ERR(module, "Invalid load order module-type '%s', ignored\n", cptr);
+			ERR("Invalid load order module-type '%s', ignored\n", cptr);
 		}
 
 		if(type != MODULE_LOADORDER_INVALID)
@@ -179,7 +179,7 @@
 		if(!cmp_sort_func(plo, &module_loadorder[i]))
 		{
 			if(!override)
-				ERR(module, "Module '%s' is already in the list of overrides, using first definition\n", plo->modulename);
+				ERR("Module '%s' is already in the list of overrides, using first definition\n", plo->modulename);
 			else
 				memcpy(module_loadorder[i].loadorder, plo->loadorder, sizeof(plo->loadorder));
 			return TRUE;
@@ -196,7 +196,7 @@
 								     nmodule_loadorder_alloc * sizeof(module_loadorder_t));
 		if(!module_loadorder)
 		{
-			MSG("Virtual memory exhausted\n");
+			MESSAGE("Virtual memory exhausted\n");
 			exit(1);
 		}
 	}
@@ -230,7 +230,7 @@
 		if(ext)
 		{
 			if(strlen(ext) == 4 && (!strcasecmp(ext, ".dll") || !strcasecmp(ext, ".exe")))
-				MSG("Warning: Loadorder override '%s' contains an extension and might not be found during lookup\n", cptr);
+				MESSAGE("Warning: Loadorder override '%s' contains an extension and might not be found during lookup\n", cptr);
 		}
 
 		ldo.modulename = cptr;
@@ -279,7 +279,7 @@
 		*value = '\0';
 		value++;
 
-		TRACE(module, "Commandline override '%s' = '%s'\n", key, value);
+		TRACE("Commandline override '%s' = '%s'\n", key, value);
 		
 		if(!AddLoadOrderSet(key, value, TRUE))
 		{
@@ -373,7 +373,7 @@
 	if(nbuffer)
 	{
 		extra_ld_library_path = HEAP_strdupA(SystemHeap, 0, buffer);
-		TRACE(module, "Setting extra LD_LIBRARY_PATH=%s\n", buffer);
+		TRACE("Setting extra LD_LIBRARY_PATH=%s\n", buffer);
 	}
 #endif
 
@@ -381,11 +381,11 @@
 	nbuffer = PROFILE_GetWineIniString("DllDefaults", "DefaultLoadOrder", "n,e,s,b", buffer, sizeof(buffer));
 	if(!nbuffer)
 	{
-		MSG("MODULE_InitLoadOrder: misteriously read nothing from default loadorder\n");
+		MESSAGE("MODULE_InitLoadOrder: misteriously read nothing from default loadorder\n");
 		return FALSE;
 	}
 
-	TRACE(module, "Setting default loadorder=%s\n", buffer);
+	TRACE("Setting default loadorder=%s\n", buffer);
 
 	if(!ParseLoadOrder(buffer, &default_loadorder))
 		return FALSE;
@@ -405,7 +405,7 @@
 	nbuffer = PROFILE_GetWineIniString("DllOverrides", NULL, "", buffer, sizeof(buffer));
 	if(nbuffer == BUFFERSIZE-2)
 	{
-		ERR(module, "BUFFERSIZE %d is too small to read [DllOverrides]. Needs to grow in the source\n", BUFFERSIZE);
+		ERR("BUFFERSIZE %d is too small to read [DllOverrides]. Needs to grow in the source\n", BUFFERSIZE);
 		return FALSE;
 	}
 	if(nbuffer)
@@ -422,16 +422,16 @@
 			nbuffer = PROFILE_GetWineIniString("DllOverrides", key, "", value, sizeof(value));
 			if(!nbuffer)
 			{
-				ERR(module, "Module(s) '%s' will always fail to load. Are you sure you want this?\n", key);
+				ERR("Module(s) '%s' will always fail to load. Are you sure you want this?\n", key);
 				value[0] = '\0';	/* Just in case */
 			}
 			if(nbuffer == BUFFERSIZE-2)
 			{
-				ERR(module, "BUFFERSIZE %d is too small to read [DllOverrides] key '%s'. Needs to grow in the source\n", BUFFERSIZE, key);
+				ERR("BUFFERSIZE %d is too small to read [DllOverrides] key '%s'. Needs to grow in the source\n", BUFFERSIZE, key);
 				return FALSE;
 			}
 
-			TRACE(module, "Key '%s' uses override '%s'\n", key, value);
+			TRACE("Key '%s' uses override '%s'\n", key, value);
 
                         if(!AddLoadOrderSet(key, value, TRUE))
 				return FALSE;
@@ -441,7 +441,7 @@
 	/* Add the commandline overrides to the pool */
 	if(!ParseCommandlineOverrides())
 	{
-		MSG(	"Syntax: -dll name[,name[,...]]={native|elfdll|so|builtin}[,{n|e|s|b}[,...]][:...]\n"
+		MESSAGE(	"Syntax: -dll name[,name[,...]]={native|elfdll|so|builtin}[,{n|e|s|b}[,...]][:...]\n"
 			"    - 'name' is the name of any dll without extension\n"
 			"    - the order of loading (native, elfdll, so and builtin) can be abbreviated\n"
 			"      with the first letter\n"
@@ -460,7 +460,7 @@
 	nbuffer = PROFILE_GetWineIniString("DllPairs", NULL, "", buffer, sizeof(buffer));
 	if(nbuffer == BUFFERSIZE-2)
 	{
-		ERR(module, "BUFFERSIZE %d is too small to read [DllPairs]. Needs to grow in the source\n", BUFFERSIZE);
+		ERR("BUFFERSIZE %d is too small to read [DllPairs]. Needs to grow in the source\n", BUFFERSIZE);
 		return FALSE;
 	}
 	if(nbuffer)
@@ -479,12 +479,12 @@
 			nbuffer = PROFILE_GetWineIniString("DllPairs", key, "", value, sizeof(value));
 			if(!nbuffer)
 			{
-				ERR(module, "Module pair '%s' is not associated with another module?\n", key);
+				ERR("Module pair '%s' is not associated with another module?\n", key);
 				continue;
 			}
 			if(nbuffer == BUFFERSIZE-2)
 			{
-				ERR(module, "BUFFERSIZE %d is too small to read [DllPairs] key '%s'. Needs to grow in the source\n", BUFFERSIZE, key);
+				ERR("BUFFERSIZE %d is too small to read [DllPairs] key '%s'. Needs to grow in the source\n", BUFFERSIZE, key);
 				return FALSE;
 			}
 
@@ -493,7 +493,7 @@
 			assert(plo1 && plo2);
 
 			if(memcmp(plo1->loadorder, plo2->loadorder, sizeof(plo1->loadorder)))
-				MSG("Warning: Modules '%s' and '%s' have different loadorder which may cause trouble\n", key, value);
+				MESSAGE("Warning: Modules '%s' and '%s' have different loadorder which may cause trouble\n", key, value);
 		}
 	}
 
@@ -551,7 +551,7 @@
 	len = strlen(name);
 	if(len >= sizeof(fname) || len <= 0)
 	{
-		ERR(module, "Path '%s' -> '%s' reduces to zilch or just too large...\n", path, name);
+		ERR("Path '%s' -> '%s' reduces to zilch or just too large...\n", path, name);
 		return &default_loadorder;
 	}
 
@@ -562,7 +562,7 @@
 	lo.modulename = fname;
 	tmp = bsearch(&lo, module_loadorder, nmodule_loadorder, sizeof(module_loadorder[0]), cmp_sort_func);
 
-	TRACE(module, "Looking for '%s' (%s), found '%s'\n", path, fname, tmp ? tmp->modulename : "<nothing>");
+	TRACE("Looking for '%s' (%s), found '%s'\n", path, fname, tmp ? tmp->modulename : "<nothing>");
 
 	if(!tmp)
 		return &default_loadorder;
diff --git a/loader/main.c b/loader/main.c
index a7b361b..b182db5 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -44,7 +44,7 @@
 #include "winsock.h"
 #include "thread.h"
 #include "task.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "psdrv.h"
 #include "server.h"
 #include "cursoricon.h"
diff --git a/loader/ne/convert.c b/loader/ne/convert.c
index a97af8e..590e77a 100644
--- a/loader/ne/convert.c
+++ b/loader/ne/convert.c
@@ -7,7 +7,7 @@
 #include <string.h>
 #include "wine/winuser16.h"
 #include "module.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(resource)
@@ -407,7 +407,7 @@
 {
     HGLOBAL16 handle;
 
-    TRACE( resource, "module=%04x type=%04x\n", pModule->self, type );
+    TRACE("module=%04x type=%04x\n", pModule->self, type );
     if (!pModule || !bits || !size) return 0;
 
     handle = GlobalAlloc16( 0, size );
@@ -427,7 +427,7 @@
         break;
 
     case RT_STRING16:
-        FIXME( resource, "not yet implemented!\n" );
+        FIXME("not yet implemented!\n" );
         /* fall through */
 
     default:
diff --git a/loader/ne/module.c b/loader/ne/module.c
index 677e19c..67d946a 100644
--- a/loader/ne/module.c
+++ b/loader/ne/module.c
@@ -26,7 +26,7 @@
 #include "toolhelp.h"
 #include "snoop.h"
 #include "stackframe.h"
-#include "debug.h"
+#include "debugtools.h"
 #include "file.h"
 #include "loadorder.h"
 #include "elfdll.h"
@@ -69,72 +69,72 @@
 
     if (!(pModule = NE_GetPtr( hModule )))
     {
-        MSG( "**** %04x is not a module handle\n", hModule );
+        MESSAGE( "**** %04x is not a module handle\n", hModule );
         return;
     }
 
       /* Dump the module info */
-    DUMP( "---\n" );
-    DUMP( "Module %04x:\n", hModule );
-    DUMP( "count=%d flags=%04x heap=%d stack=%d\n",
+    DPRINTF( "---\n" );
+    DPRINTF( "Module %04x:\n", hModule );
+    DPRINTF( "count=%d flags=%04x heap=%d stack=%d\n",
 	  pModule->count, pModule->flags,
 	  pModule->heap_size, pModule->stack_size );
-    DUMP( "cs:ip=%04x:%04x ss:sp=%04x:%04x ds=%04x nb seg=%d modrefs=%d\n",
+    DPRINTF( "cs:ip=%04x:%04x ss:sp=%04x:%04x ds=%04x nb seg=%d modrefs=%d\n",
 	  pModule->cs, pModule->ip, pModule->ss, pModule->sp, pModule->dgroup,
 	  pModule->seg_count, pModule->modref_count );
-    DUMP( "os_flags=%d swap_area=%d version=%04x\n",
+    DPRINTF( "os_flags=%d swap_area=%d version=%04x\n",
 	  pModule->os_flags, pModule->min_swap_area,
 	  pModule->expected_version );
     if (pModule->flags & NE_FFLAGS_WIN32)
-        DUMP( "PE module=%08x\n", pModule->module32 );
+        DPRINTF( "PE module=%08x\n", pModule->module32 );
 
       /* Dump the file info */
-    DUMP( "---\n" );
-    DUMP( "Filename: '%s'\n", NE_MODULE_NAME(pModule) );
+    DPRINTF( "---\n" );
+    DPRINTF( "Filename: '%s'\n", NE_MODULE_NAME(pModule) );
 
       /* Dump the segment table */
-    DUMP( "---\n" );
-    DUMP( "Segment table:\n" );
+    DPRINTF( "---\n" );
+    DPRINTF( "Segment table:\n" );
     pSeg = NE_SEG_TABLE( pModule );
     for (i = 0; i < pModule->seg_count; i++, pSeg++)
-        DUMP( "%02x: pos=%d size=%d flags=%04x minsize=%d hSeg=%04x\n",
+        DPRINTF( "%02x: pos=%d size=%d flags=%04x minsize=%d hSeg=%04x\n",
 	      i + 1, pSeg->filepos, pSeg->size, pSeg->flags,
 	      pSeg->minsize, pSeg->hSeg );
 
       /* Dump the resource table */
-    DUMP( "---\n" );
-    DUMP( "Resource table:\n" );
+    DPRINTF( "---\n" );
+    DPRINTF( "Resource table:\n" );
     if (pModule->res_table)
     {
         pword = (WORD *)((BYTE *)pModule + pModule->res_table);
-        DUMP( "Alignment: %d\n", *pword++ );
+        DPRINTF( "Alignment: %d\n", *pword++ );
         while (*pword)
         {
             struct resource_typeinfo_s *ptr = (struct resource_typeinfo_s *)pword;
             struct resource_nameinfo_s *pname = (struct resource_nameinfo_s *)(ptr + 1);
-            DUMP( "id=%04x count=%d\n", ptr->type_id, ptr->count );
+            DPRINTF( "id=%04x count=%d\n", ptr->type_id, ptr->count );
             for (i = 0; i < ptr->count; i++, pname++)
-                DUMP( "offset=%d len=%d id=%04x\n",
+                DPRINTF( "offset=%d len=%d id=%04x\n",
 		      pname->offset, pname->length, pname->id );
             pword = (WORD *)pname;
         }
     }
-    else DUMP( "None\n" );
+    else DPRINTF( "None\n" );
 
       /* Dump the resident name table */
-    DUMP( "---\n" );
-    DUMP( "Resident-name table:\n" );
+    DPRINTF( "---\n" );
+    DPRINTF( "Resident-name table:\n" );
     pstr = (char *)pModule + pModule->name_table;
     while (*pstr)
     {
-        DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
+        DPRINTF( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
 	      *(WORD *)(pstr + *pstr + 1) );
         pstr += *pstr + 1 + sizeof(WORD);
     }
 
       /* Dump the module reference table */
-    DUMP( "---\n" );
-    DUMP( "Module ref table:\n" );
+    DPRINTF( "---\n" );
+    DPRINTF( "Module ref table:\n" );
     if (pModule->modref_table)
     {
         pword = (WORD *)((BYTE *)pModule + pModule->modref_table);
@@ -142,44 +142,44 @@
         {
             char name[10];
             GetModuleName16( *pword, name, sizeof(name) );
-	    DUMP( "%d: %04x -> '%s'\n", i, *pword, name );
+	    DPRINTF( "%d: %04x -> '%s'\n", i, *pword, name );
         }
     }
-    else DUMP( "None\n" );
+    else DPRINTF( "None\n" );
 
       /* Dump the entry table */
-    DUMP( "---\n" );
-    DUMP( "Entry table:\n" );
+    DPRINTF( "---\n" );
+    DPRINTF( "Entry table:\n" );
     bundle = (ET_BUNDLE *)((BYTE *)pModule+pModule->entry_table);    
     do {
 	entry = (ET_ENTRY *)((BYTE *)bundle+6);
-	DUMP( "Bundle %d-%d: %02x\n", bundle->first, bundle->last, entry->type);
+	DPRINTF( "Bundle %d-%d: %02x\n", bundle->first, bundle->last, entry->type);
 	ordinal = bundle->first;
 	while (ordinal < bundle->last)
         {
 	    if (entry->type == 0xff)
-		DUMP("%d: %02x:%04x (moveable)\n", ordinal++, entry->segnum, entry->offs);
+		DPRINTF("%d: %02x:%04x (moveable)\n", ordinal++, entry->segnum, entry->offs);
 	    else
-		DUMP("%d: %02x:%04x (fixed)\n", ordinal++, entry->segnum, entry->offs);
+		DPRINTF("%d: %02x:%04x (fixed)\n", ordinal++, entry->segnum, entry->offs);
 	    entry++;
     }
     } while ( (bundle->next)
 	   && (bundle = ((ET_BUNDLE *)((BYTE *)pModule + bundle->next))) );
 
     /* Dump the non-resident names table */
-    DUMP( "---\n" );
-    DUMP( "Non-resident names table:\n" );
+    DPRINTF( "---\n" );
+    DPRINTF( "Non-resident names table:\n" );
     if (pModule->nrname_handle)
     {
         pstr = (char *)GlobalLock16( pModule->nrname_handle );
         while (*pstr)
         {
-            DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
+            DPRINTF( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
                    *(WORD *)(pstr + *pstr + 1) );
             pstr += *pstr + 1 + sizeof(WORD);
         }
     }
-    DUMP( "\n" );
+    DPRINTF( "\n" );
 }
 
 
@@ -191,16 +191,16 @@
 void NE_WalkModules(void)
 {
     HMODULE16 hModule = hFirstModule;
-    MSG( "Module Flags Name\n" );
+    MESSAGE( "Module Flags Name\n" );
     while (hModule)
     {
         NE_MODULE *pModule = NE_GetPtr( hModule );
         if (!pModule)
         {
-            MSG( "Bad module %04x in list\n", hModule );
+            MESSAGE( "Bad module %04x in list\n", hModule );
             return;
         }
-        MSG( " %04x  %04x  %.*s\n", hModule, pModule->flags,
+        MESSAGE( " %04x  %04x  %.*s\n", hModule, pModule->flags,
                  *((char *)pModule + pModule->name_table),
                  (char *)pModule + pModule->name_table + 1 );
         hModule = pModule->next;
@@ -232,7 +232,7 @@
     if (!(pModule = NE_GetPtr( hModule ))) return 0;
     assert( !(pModule->flags & NE_FFLAGS_WIN32) );
 
-    TRACE( module, "(%04x,'%s')\n", hModule, name );
+    TRACE("(%04x,'%s')\n", hModule, name );
 
       /* First handle names of the form '#xxxx' */
 
@@ -254,7 +254,7 @@
     {
         if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len ))
         {
-            TRACE(module, "  Found: ordinal=%d\n",
+            TRACE("  Found: ordinal=%d\n",
                             *(WORD *)(cpnt + *cpnt + 1) );
             return *(WORD *)(cpnt + *cpnt + 1);
         }
@@ -272,7 +272,7 @@
     {
         if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len ))
         {
-            TRACE(module, "  Found: ordinal=%d\n",
+            TRACE("  Found: ordinal=%d\n",
                             *(WORD *)(cpnt + *cpnt + 1) );
             return *(WORD *)(cpnt + *cpnt + 1);
         }
@@ -370,7 +370,7 @@
 
     static HANDLE cachedfd = -1;
 
-    TRACE( module, "(%p) cache: mod=%p fd=%d\n",
+    TRACE("(%p) cache: mod=%p fd=%d\n",
            pModule, pCachedModule, cachedfd );
     if (pCachedModule == pModule) return cachedfd;
     CloseHandle( cachedfd );
@@ -378,11 +378,11 @@
     name = NE_MODULE_NAME( pModule );
     if ((cachedfd = CreateFileA( name, GENERIC_READ, FILE_SHARE_READ,
                                    NULL, OPEN_EXISTING, 0, -1 )) == -1)
-        MSG( "Can't open file '%s' for module %04x\n", name, pModule->self );
+        MESSAGE( "Can't open file '%s' for module %04x\n", name, pModule->self );
     else
         /* FIXME: should not be necessary */
         cachedfd = ConvertToGlobalHandle(cachedfd);
-    TRACE(module, "opened '%s' -> %d\n",
+    TRACE("opened '%s' -> %d\n",
                     name, cachedfd );
     return cachedfd;
 }
@@ -425,7 +425,7 @@
     if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE16)11;  /* invalid exe */
 
     if (ne_header.ne_magic == IMAGE_OS2_SIGNATURE_LX) {
-      MSG("Sorry, this is an OS/2 linear executable (LX) file !\n");
+      MESSAGE("Sorry, this is an OS/2 linear executable (LX) file !\n");
       return (HMODULE16)12;
     }
 
@@ -475,7 +475,7 @@
     {
         fastload_offset=ne_header.fastload_offset<<ne_header.align_shift_count;
         fastload_length=ne_header.fastload_length<<ne_header.align_shift_count;
-        TRACE(module, "Using fast-load area offset=%x len=%d\n",
+        TRACE("Using fast-load area offset=%x len=%d\n",
                         fastload_offset, fastload_length );
         if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL)
         {
@@ -483,7 +483,7 @@
             if (_hread16(hFile, fastload, fastload_length) != fastload_length)
             {
                 HeapFree( SystemHeap, 0, fastload );
-                WARN( module, "Error reading fast-load area!\n");
+                WARN("Error reading fast-load area!\n");
                 fastload = NULL;
             }
         }
@@ -590,7 +590,7 @@
     {
         BYTE nr_entries, type, *s;
 
-	TRACE(module, "Converting entry table.\n");
+	TRACE("Converting entry table.\n");
     pModule->entry_table = (int)pData - (int)pModule;
     if (!READ( mz_header.e_lfanew + ne_header.entry_tab_offset,
                 ne_header.entry_tab_length, pTempEntryTable ))
@@ -603,10 +603,10 @@
     }
 
         s = pTempEntryTable;
-        TRACE(module, "entry table: offs %04x, len %04x, entries %d\n", ne_header.entry_tab_offset, ne_header.entry_tab_length, *s);
+        TRACE("entry table: offs %04x, len %04x, entries %d\n", ne_header.entry_tab_offset, ne_header.entry_tab_length, *s);
 
 	bundle = (ET_BUNDLE *)pData;
-        TRACE(module, "first bundle: %p\n", bundle);
+        TRACE("first bundle: %p\n", bundle);
 	memset(bundle, 0, sizeof(ET_BUNDLE)); /* in case no entry table exists */
 	entry = (ET_ENTRY *)((BYTE *)bundle+6);
 
@@ -649,7 +649,7 @@
 		    oldbundle = bundle;
 		    oldbundle->next = ((int)entry - (int)pModule);
                     bundle = (ET_BUNDLE *)entry;
-                    TRACE(module, "new bundle: %p\n", bundle);
+                    TRACE("new bundle: %p\n", bundle);
                     bundle->first = bundle->last =
                         oldbundle->last + nr_entries;
                     bundle->next = 0;
@@ -671,7 +671,7 @@
 	     2 * (ne_header.entry_tab_length - ne_header.n_mov_entry_points*6);
 
     if ((DWORD)entry > (DWORD)pData)
-       ERR(module, "converted entry table bigger than reserved space !!!\nentry: %p, pData: %p. Please report !\n", entry, pData);
+       ERR("converted entry table bigger than reserved space !!!\nentry: %p, pData: %p. Please report !\n", entry, pData);
 
     /* Store the filename information */
 
@@ -751,7 +751,7 @@
         memcpy( buffer, pstr + 1, *pstr );
        *(buffer + *pstr) = 0; /* terminate it */
 
-        TRACE(module, "Loading '%s'\n", buffer );
+        TRACE("Loading '%s'\n", buffer );
         if (!(*pModRef = GetModuleHandle16( buffer )))
         {
             /* If the DLL is not loaded yet, load it and store */
@@ -762,7 +762,7 @@
             {
                 /* FIXME: cleanup what was done */
 
-                MSG( "Could not load '%s' required by '%.*s', error=%d\n",
+                MESSAGE( "Could not load '%s' required by '%.*s', error=%d\n",
                      buffer, *((BYTE*)pModule + pModule->name_table),
                      (char *)pModule + pModule->name_table + 1, hDLL );
                 return FALSE;
@@ -887,22 +887,22 @@
 		switch(plo->loadorder[i])
 		{
 		case MODULE_LOADORDER_DLL:
-			TRACE(module, "Trying native dll '%s'\n", libname);
+			TRACE("Trying native dll '%s'\n", libname);
 			hinst = NE_LoadModule(libname, implicit);
 			break;
 
 		case MODULE_LOADORDER_ELFDLL:
-			TRACE(module, "Trying elfdll '%s'\n", libname);
+			TRACE("Trying elfdll '%s'\n", libname);
 			hinst = ELFDLL_LoadModule16(libname, implicit);
 			break;
 
 		case MODULE_LOADORDER_BI:
-			TRACE(module, "Trying built-in '%s'\n", libname);
+			TRACE("Trying built-in '%s'\n", libname);
 			hinst = fnBUILTIN_LoadModule(libname, TRUE);
 			break;
 
 		default:
-			ERR(module, "Got invalid loadorder type %d (%s index %d)\n", plo->loadorder[i], plo->modulename, i);
+			ERR("Got invalid loadorder type %d (%s index %d)\n", plo->loadorder[i], plo->modulename, i);
 		/* Fall through */
 
 		case MODULE_LOADORDER_SO:	/* This is not supported for NE modules */
@@ -921,7 +921,7 @@
 				hModule = GetModuleHandle16(libname);
 				if(!hModule)
 				{
-					ERR(module, "Serious trouble. Just loaded module '%s' (hinst=0x%04x), but can't get module handle\n",
+					ERR("Serious trouble. Just loaded module '%s' (hinst=0x%04x), but can't get module handle\n",
 						libname, hinst);
 					return 6;	/* ERROR_INVALID_HANDLE seems most appropriate */
 				}
@@ -929,12 +929,12 @@
 				pModule = NE_GetPtr(hModule);
 				if(!pModule)
 				{
-					ERR(module, "Serious trouble. Just loaded module '%s' (hinst=0x%04x), but can't get NE_MODULE pointer\n",
+					ERR("Serious trouble. Just loaded module '%s' (hinst=0x%04x), but can't get NE_MODULE pointer\n",
 						libname, hinst);
 					return 6;	/* ERROR_INVALID_HANDLE seems most appropriate */
 				}
 
-				TRACE(module, "Loaded module '%s' at 0x%04x, \n", libname, hinst);
+				TRACE("Loaded module '%s' at 0x%04x, \n", libname, hinst);
 
 				/*
 				 * Call initialization routines for all loaded DLLs. Note that
@@ -1153,7 +1153,7 @@
     if (dirsep1)
       *dirsep1=0;
 
-    TRACE( module, "looking for (%p) %s and %s \n", 
+    TRACE("looking for (%p) %s and %s \n", 
 	   libname, libname,strippedname );
 
     /* Load library module */
@@ -1178,7 +1178,7 @@
     if (ordinal) WEP = NE_GetEntryPoint( hModule, ordinal );
     if (!WEP)
     {
-	WARN(module, "module %04x doesn't have a WEP\n", hModule );
+	WARN("module %04x doesn't have a WEP\n", hModule );
 	return FALSE;
     }
     return Callbacks->CallWindowsExitProc( WEP, WEP_FREE_DLL );
@@ -1200,7 +1200,7 @@
     if (!(pModule = NE_GetPtr( hModule ))) return FALSE;
     hModule = pModule->self;
 
-    TRACE( module, "%04x count %d\n", hModule, pModule->count );
+    TRACE("%04x count %d\n", hModule, pModule->count );
 
     if (((INT16)(--pModule->count)) > 0 ) return TRUE;
     else pModule->count = 0;
@@ -1274,7 +1274,7 @@
  */
 void WINAPI FreeLibrary16( HINSTANCE16 handle )
 {
-    TRACE(module,"%04x\n", handle );
+    TRACE("%04x\n", handle );
     FreeModule16( handle );
 }
 
@@ -1330,7 +1330,7 @@
     if (!hModule) hModule = GetCurrentTask();
     if (!(pModule = NE_GetPtr( hModule ))) return 0;
     lstrcpynA( lpFileName, NE_MODULE_NAME(pModule), nSize );
-    TRACE(module, "%s\n", lpFileName );
+    TRACE("%s\n", lpFileName );
     return strlen(lpFileName);
 }
 
@@ -1367,7 +1367,7 @@
     char	tmpstr[128];
     NE_MODULE *pModule;
 
-    TRACE(module, "(%s)\n", name);
+    TRACE("(%s)\n", name);
 
     if (!HIWORD(name))
     	return GetExePtr(LOWORD(name));
@@ -1462,7 +1462,7 @@
 
     if (!strcmp(tmpstr,"TIMER"))
     {
-	FIXME(module, "Eh... Should return caller's code segment, expect crash\n");
+	FIXME("Eh... Should return caller's code segment, expect crash\n");
 	return 0;
     }
 
diff --git a/loader/ne/resource.c b/loader/ne/resource.c
index 6bd6215..4c1fd44 100644
--- a/loader/ne/resource.c
+++ b/loader/ne/resource.c
@@ -21,7 +21,7 @@
 #include "neexe.h"
 #include "resource.h"
 #include "callback.h"
-#include "debug.h"
+#include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(resource)
 
@@ -53,13 +53,13 @@
 	pNameInfo = (NE_NAMEINFO *)(pTypeInfo + 1);
 	for (count = pTypeInfo->count; count > 0; count--, pNameInfo++)
 	{
-            TRACE(resource, "NameTable entry: type=%04x id=%04x\n",
+            TRACE("NameTable entry: type=%04x id=%04x\n",
                               pTypeInfo->type_id, pNameInfo->id );
             handle = LoadResource16( pModule->self, 
 				   (HRSRC16)((int)pNameInfo - (int)pModule) );
             for(p = (WORD*)LockResource16(handle); p && *p; p = (WORD *)((char*)p+*p))
             {
-                TRACE(resource,"  type=%04x '%s' id=%04x '%s'\n",
+                TRACE("  type=%04x '%s' id=%04x '%s'\n",
                                   p[1], (char *)(p+3), p[2],
                                   (char *)(p+3)+strlen((char *)(p+3))+1 );
                 /* Check for correct type */
@@ -87,7 +87,7 @@
 
                 /* If we get here, we've found the entry */
 
-                TRACE(resource, "  Found!\n" );
+                TRACE("  Found!\n" );
                 ret = MAKELONG( p[1], p[2] );
                 break;
             }
@@ -119,11 +119,11 @@
 		BYTE *p = pResTab + pTypeInfo->type_id;
 		if ((*p == len) && !lstrncmpiA( p+1, str, len ))
 		{
-		    TRACE(resource, "  Found type '%s'\n", str );
+		    TRACE("  Found type '%s'\n", str );
 		    return pTypeInfo;
 		}
 	    }
-	    TRACE(resource, "  Skipping type %04x\n", pTypeInfo->type_id );
+	    TRACE("  Skipping type %04x\n", pTypeInfo->type_id );
 	    pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
 	}
     }
@@ -134,10 +134,10 @@
 	{
             if (pTypeInfo->type_id == id)
 	    {
-		TRACE(resource, "  Found type %04x\n", id );
+		TRACE("  Found type %04x\n", id );
 		return pTypeInfo;
 	    }
-	    TRACE(resource, "  Skipping type %04x\n", pTypeInfo->type_id );
+	    TRACE("  Skipping type %04x\n", pTypeInfo->type_id );
 	    pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
 	}
     }
@@ -195,7 +195,7 @@
 	WORD sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
 	NE_NAMEINFO* pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
 
-        TRACE(resource, "loading, pos=%d, len=%d\n",
+        TRACE("loading, pos=%d, len=%d\n",
 		     (int)pNameInfo->offset << sizeShift,
 		     (int)pNameInfo->length << sizeShift );
 	if( hMemObj )
@@ -236,7 +236,7 @@
             DefResourceHandlerProc = NULL;
     }
 
-    TRACE(resource,"InitResourceHandler[%04x]\n", hModule );
+    TRACE("InitResourceHandler[%04x]\n", hModule );
 
     while(pTypeInfo->type_id)
     {
@@ -260,7 +260,7 @@
 
     if (!pModule || !pModule->res_table) return NULL;
 
-    TRACE( resource, "module=%04x type=%s\n",
+    TRACE("module=%04x type=%s\n",
            hModule, debugres_a(PTR_SEG_TO_LIN(typeId)) );
 
     for (;;)
@@ -286,7 +286,7 @@
 
     if (!pModule || !pModule->res_table) return 0;
 
-    TRACE( resource, "module=%04x name=%s type=%s\n", 
+    TRACE("module=%04x name=%s type=%s\n", 
            pModule->self, debugres_a(PTR_SEG_TO_LIN(name)),
            debugres_a(PTR_SEG_TO_LIN(type)) );
 
@@ -296,7 +296,7 @@
 	if (ptr[0] == '#')
 	    if (!(name = (LPCSTR)atoi( ptr + 1 )))
             {
-                WARN(resource, "Incorrect resource name: %s\n", ptr);
+                WARN("Incorrect resource name: %s\n", ptr);
                 return 0;
 	    }
     }
@@ -307,7 +307,7 @@
 	if (ptr[0] == '#')
             if (!(type = (LPCSTR)atoi( ptr + 1 )))
             {
-                WARN(resource, "Incorrect resource type: %s\n", ptr);
+                WARN("Incorrect resource type: %s\n", ptr);
                 return 0;
             }
     }
@@ -331,14 +331,14 @@
             break;
         if ((pNameInfo = NE_FindResourceFromType( pResTab, pTypeInfo, name )))
         {
-            TRACE(resource, "    Found id %08lx\n", (DWORD)name );
+            TRACE("    Found id %08lx\n", (DWORD)name );
             return (HRSRC16)( (int)pNameInfo - (int)pModule );
         }
-        TRACE(resource, "    Not found, going on\n" );
+        TRACE("    Not found, going on\n" );
         pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
     }
 
-    WARN(resource, "failed!\n");
+    WARN("failed!\n");
     return 0;
 }
 
@@ -354,7 +354,7 @@
     NE_MODULE *pModule = NE_GetPtr( hModule );
     if (!pModule || !pModule->res_table || !hRsrc) return 0;
 
-    TRACE( resource, "module=%04x res=%04x size=%ld\n", hModule, hRsrc, size );
+    TRACE("module=%04x res=%04x size=%ld\n", hModule, hRsrc, size );
 
     sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
@@ -372,12 +372,12 @@
 HGLOBAL16 WINAPI DirectResAlloc16( HINSTANCE16 hInstance, WORD wType,
                                  UINT16 wSize )
 {
-    TRACE(resource,"(%04x,%04x,%04x)\n",
+    TRACE("(%04x,%04x,%04x)\n",
                      hInstance, wType, wSize );
     if (!(hInstance = GetExePtr( hInstance ))) return 0;
     if(wType != 0x10)	/* 0x10 is the only observed value, passed from
                            CreateCursorIndirect. */
-        TRACE(resource, "(wType=%x)\n", wType);
+        TRACE("(wType=%x)\n", wType);
     return GLOBAL_Alloc(GMEM_MOVEABLE, wSize, hInstance, FALSE, FALSE, FALSE);
 }
 
@@ -391,7 +391,7 @@
 
     if (!pModule || !pModule->res_table || !hRsrc) return -1;
 
-    TRACE(resource, "module=%04x res=%04x\n", pModule->self, hRsrc );
+    TRACE("module=%04x res=%04x\n", pModule->self, hRsrc );
 
     if ((fd = _lopen16( NE_MODULE_NAME(pModule), OF_READ )) != HFILE_ERROR16)
     {
@@ -413,7 +413,7 @@
 
     if (!pModule || !pModule->res_table) return 0;
 
-    TRACE(resource, "module=%04x res=%04x\n", pModule->self, hRsrc );
+    TRACE("module=%04x res=%04x\n", pModule->self, hRsrc );
 
     sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
     pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
@@ -430,7 +430,7 @@
     NE_NAMEINFO *pNameInfo = NULL;
     int d;
 
-    TRACE( resource, "module=%04x res=%04x\n", pModule->self, hRsrc );
+    TRACE("module=%04x res=%04x\n", pModule->self, hRsrc );
     if (!hRsrc || !pModule || !pModule->res_table) return 0;
 
     /* First, verify hRsrc (just an offset from pModule to the needed pNameInfo) */
@@ -461,7 +461,7 @@
 	    && !(GlobalFlags16(pNameInfo->handle) & GMEM_DISCARDED))
 	{
 	    pNameInfo->usage++;
-	    TRACE(resource, "  Already loaded, new count=%d\n",
+	    TRACE("  Already loaded, new count=%d\n",
 			      pNameInfo->usage );
 	}
 	else
@@ -497,7 +497,7 @@
 
     if (!handle || !pModule || !pModule->res_table) return handle;
 
-    TRACE(resource, "handle=%04x\n", handle );
+    TRACE("handle=%04x\n", handle );
 
     pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
     while (pTypeInfo->type_id)
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index b6c7754..e415b48 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -22,7 +22,7 @@
 #include "libres.h"
 #include "stackframe.h"
 #include "neexe.h"
-#include "debug.h"
+#include "debugtools.h"
 
 /**********************************************************************
  *  HMODULE32toPE_MODREF 
diff --git a/loader/signal.c b/loader/signal.c
index 1fdb019..5e3e6f5 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -38,7 +38,7 @@
 #include "miscemu.h"
 #include "dosexe.h"
 #include "thread.h"
-#include "debug.h"
+#include "debugtools.h"
 
 void (*fnWINE_Debugger)(int,SIGCONTEXT*) = NULL;
 void (*ctx_debug_call)(int sig,CONTEXT*ctx)=NULL;
@@ -268,22 +268,22 @@
 #endif
     if (IS_SELECTOR_SYSTEM(CS_sig(HANDLER_CONTEXT)))
     {
-        MSG("%s in 32-bit code (0x%08lx).\n", fault, EIP_sig(HANDLER_CONTEXT));
+        MESSAGE("%s in 32-bit code (0x%08lx).\n", fault, EIP_sig(HANDLER_CONTEXT));
     }
     else
     {
-        MSG("%s in 16-bit code (%04x:%04lx).\n", fault,
+        MESSAGE("%s in 16-bit code (%04x:%04lx).\n", fault,
             (WORD)CS_sig(HANDLER_CONTEXT), EIP_sig(HANDLER_CONTEXT) );
     }
 #ifdef CR2_sig
-    MSG("Fault address is 0x%08lx\n",CR2_sig(HANDLER_CONTEXT));
+    MESSAGE("Fault address is 0x%08lx\n",CR2_sig(HANDLER_CONTEXT));
 #endif
 #endif
 
     if (fnWINE_Debugger)
 	fnWINE_Debugger( signal, HANDLER_CONTEXT );
     else {
-    	MSG("stopping pid %d due to unhandled %s.\n",getpid(),fault);
+    	MESSAGE("stopping pid %d due to unhandled %s.\n",getpid(),fault);
 	kill(getpid(),SIGSTOP);
     }
 }
diff --git a/programs/notepad/dialog.c b/programs/notepad/dialog.c
index 8f4b239..e4c9428 100644
--- a/programs/notepad/dialog.c
+++ b/programs/notepad/dialog.c
@@ -26,7 +26,6 @@
 #else
   #include "version.h"
   #include "winnls.h"
-  #include "debug.h"
 #endif
 
 static LRESULT DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
index 2c43ba3..bb15208 100644
--- a/programs/winhelp/macro.c
+++ b/programs/winhelp/macro.c
@@ -12,7 +12,6 @@
 #endif
 #include "winhelp.h"
 #include "macro.h"
-#include "debug.h"
 
 VOID MACRO_About(VOID)
 {
