Cleaned up a few USER dependencies.

diff --git a/if1632/thunk.c b/if1632/thunk.c
index 6a9f353..6fb6d22 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -190,6 +190,10 @@
         GETADDR( DispatchMessageA );
         GETADDR( RedrawWindow );
         GETADDR( WaitForInputIdle );
+        GETADDR( MsgWaitForMultipleObjects );
+        GETADDR( WindowFromDC );
+        GETADDR( GetForegroundWindow );
+        GETADDR( IsChild );
         GETADDR( MessageBoxA );
         GETADDR( MessageBoxW );
 #undef GETADDR
diff --git a/include/callback.h b/include/callback.h
index 3ca0052..a0bea6a 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -100,6 +100,12 @@
     void WINAPI (*UserYield16)( void );
     WORD WINAPI (*DestroyIcon32)( HGLOBAL16 handle, UINT16 flags );
     DWORD WINAPI (*WaitForInputIdle)( HANDLE hProcess, DWORD dwTimeOut );
+    DWORD WINAPI (*MsgWaitForMultipleObjects)( DWORD nCount, HANDLE *pHandles,
+                                               BOOL fWaitAll, DWORD dwMilliseconds,
+                                               DWORD dwWakeMask );
+    HWND WINAPI (*WindowFromDC)( HDC hDC );
+    HWND WINAPI (*GetForegroundWindow)(void);
+    BOOL WINAPI (*IsChild)( HWND parent, HWND child );
 
     INT WINAPI (*MessageBoxA)( HWND hWnd, LPCSTR text, LPCSTR title, UINT type );
     INT WINAPI (*MessageBoxW)( HWND hwnd, LPCWSTR text, LPCWSTR title, UINT type );
diff --git a/include/keyboard.h b/include/keyboard.h
index 7ad803e..1f1bc5b 100644
--- a/include/keyboard.h
+++ b/include/keyboard.h
@@ -31,7 +31,6 @@
 
 extern BOOL KEYBOARD_GetBeepActive(void);
 extern void KEYBOARD_SetBeepActive(BOOL bActivate);
-extern void KEYBOARD_Beep(void);
 
 extern void KEYBOARD_SendEvent(BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD posX, DWORD posY, DWORD time);
 
diff --git a/loader/dos/dosvm.c b/loader/dos/dosvm.c
index 755ce81..b5fd544 100644
--- a/loader/dos/dosvm.c
+++ b/loader/dos/dosvm.c
@@ -431,7 +431,7 @@
 	break;
     }
     /* nothing yet, block while waiting for something to do */
-    waitret=MsgWaitForMultipleObjects(objc,objs,FALSE,INFINITE,QS_ALLINPUT);
+    waitret=Callout.MsgWaitForMultipleObjects(objc,objs,FALSE,INFINITE,QS_ALLINPUT);
     if (waitret==(DWORD)-1) {
       ERR_(module)("dosvm wait error=%ld\n",GetLastError());
     }
diff --git a/misc/main.c b/misc/main.c
index bb803e9..68ec23a 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -29,7 +29,6 @@
 #include "winnls.h"
 #include "console.h"
 #include "monitor.h"
-#include "keyboard.h"
 #include "gdi.h"
 #include "user.h"
 #include "windef.h"
@@ -586,31 +585,13 @@
 }
 
 /***********************************************************************
- *           MessageBeep16   (USER.104)
- */
-void WINAPI MessageBeep16( UINT16 i )
-{
-    MessageBeep( i );
-}
-
-
-/***********************************************************************
- *           MessageBeep   (USER32.390)
- */
-BOOL WINAPI MessageBeep( UINT i )
-{
-    KEYBOARD_Beep();
-    return TRUE;
-}
-
-
-/***********************************************************************
  *           Beep   (KERNEL32.11)
  */
 BOOL WINAPI Beep( DWORD dwFreq, DWORD dwDur )
 {
+    static char beep = '\a';
     /* dwFreq and dwDur are ignored by Win95 */
-    KEYBOARD_Beep();
+    if (isatty(2)) write( 2, &beep, 1 );
     return TRUE;
 }
 
diff --git a/objects/bitmap.c b/objects/bitmap.c
index a637ddc..4b8de05 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -16,11 +16,9 @@
 #include "global.h"
 #include "cursoricon.h"
 #include "debugtools.h"
-#include "monitor.h"
 #include "wine/winuser16.h"
 
-DEFAULT_DEBUG_CHANNEL(bitmap)
-DECLARE_DEBUG_CHANNEL(resource)
+DEFAULT_DEBUG_CHANNEL(bitmap);
 
 BITMAP_DRIVER *BITMAP_Driver = NULL;
 
@@ -74,7 +72,10 @@
 HBITMAP16 WINAPI CreateUserDiscardableBitmap16( WORD dummy, 
                                                 INT16 width, INT16 height )
 {
-    return CreateUserBitmap16( width, height, 1, MONITOR_GetDepth(&MONITOR_PrimaryMonitor), NULL );
+    HDC hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
+    HBITMAP16 ret = CreateCompatibleBitmap16( hdc, width, height );
+    DeleteDC( hdc );
+    return ret;
 }
 
 
diff --git a/objects/dib.c b/objects/dib.c
index ff65521..4947f12 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -10,10 +10,9 @@
 #include "callback.h"
 #include "dc.h"
 #include "debugtools.h"
-#include "monitor.h"
 #include "palette.h"
 
-DEFAULT_DEBUG_CHANNEL(bitmap)
+DEFAULT_DEBUG_CHANNEL(bitmap);
 
 /***********************************************************************
  *           DIB_GetDIBWidthBytes
@@ -849,8 +848,14 @@
 
     /* Now create the bitmap */
 
-    handle = fColor ? CreateBitmap( width, height, 1, MONITOR_GetDepth(&MONITOR_PrimaryMonitor), NULL ) :
-                      CreateBitmap( width, height, 1, 1, NULL );
+    if (fColor)
+    {
+        HDC tmpdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
+        handle = CreateCompatibleBitmap( tmpdc, width, height );
+        DeleteDC( tmpdc );
+    }
+    else handle = CreateBitmap( width, height, 1, 1, NULL );
+
     if (!handle) return 0;
 
     if (init == CBM_INIT)
diff --git a/objects/palette.c b/objects/palette.c
index 9e9050d..16e3d26 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -19,6 +19,7 @@
 #include "color.h"
 #include "palette.h"
 #include "debugtools.h"
+#include "callback.h"
 #include "winerror.h"
 
 DEFAULT_DEBUG_CHANNEL(palette)
@@ -766,25 +767,17 @@
     HPALETTE hPal,         /* [in] Handle of logical color palette */
     BOOL bForceBackground) /* [in] Foreground/background mode */
 {
-    WORD	wBkgPalette = 1;
-    PALETTEOBJ* lpt = (PALETTEOBJ*) GDI_GetObjPtr( hPal, PALETTE_MAGIC );
+    WORD wBkgPalette = 1;
 
-    TRACE("dc=%04x,pal=%04x,force=%i\n", hDC, hPal, bForceBackground);
-    if( !lpt ) return 0;
-
-    TRACE(" entries = %d\n", lpt->logpalette.palNumEntries);
-    GDI_HEAP_UNLOCK( hPal );
-
-    if( hPal != STOCK_DEFAULT_PALETTE )
+    if (!bForceBackground && (hPal != STOCK_DEFAULT_PALETTE))
     {
-	HWND hWnd = WindowFromDC( hDC );
-	HWND hActive = GetActiveWindow();
-	
-	/* set primary palette if it's related to current active */
-
-	if((!hWnd || (hActive == hWnd || IsChild16(hActive,hWnd))) &&
-            !bForceBackground )
-	    wBkgPalette = 0;
+	HWND hwnd = Callout.WindowFromDC( hDC );
+        if (hwnd)
+        {
+            HWND hForeground = Callout.GetForegroundWindow();
+            /* set primary palette if it's related to current active */
+            if (hForeground == hwnd || Callout.IsChild(hForeground,hwnd)) wBkgPalette = 0;
+        }
     }
     return GDISelectPalette16( hDC, hPal, wBkgPalette);
 }
@@ -824,8 +817,8 @@
 	/* Send palette change notification */
 
 	HWND hWnd;
- 	if( (hWnd = WindowFromDC( hDC )) )
-            SendMessage16( HWND_BROADCAST, WM_PALETTECHANGED, hWnd, 0L);
+ 	if( (hWnd = Callout.WindowFromDC( hDC )) )
+            Callout.SendMessageA( HWND_BROADCAST, WM_PALETTECHANGED, hWnd, 0L);
     }
 
     GDI_HEAP_UNLOCK( hDC );
@@ -843,13 +836,13 @@
 
     if (!(dc = (DC *) GDI_GetObjPtr( hDC, DC_MAGIC ))) return 0;
 
-    hWnd = WindowFromDC( hDC );
+    hWnd = Callout.WindowFromDC( hDC );
 
     /* Docs say that we have to remap current drawable pixel by pixel
      * but it would take forever given the speed of XGet/PutPixel.
      */
-    if (hWnd && dc->w.devCaps->sizePalette ) 
-	InvalidateRect( hWnd, NULL, FALSE );
+    if (hWnd && dc->w.devCaps->sizePalette )
+        Callout.RedrawWindow( hWnd, NULL, 0, RDW_INVALIDATE );
 
     GDI_HEAP_UNLOCK( hDC );
 
diff --git a/windows/keyboard.c b/windows/keyboard.c
index d9c1407..ccfe803 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -274,10 +274,18 @@
 }
 
 /***********************************************************************
- *		KEYBOARD_Beep
+ *           MessageBeep16   (USER.104)
  */
-void KEYBOARD_Beep(void)
+void WINAPI MessageBeep16( UINT16 i )
 {
-    USER_Driver->pBeep();
+    MessageBeep( i );
 }
 
+/***********************************************************************
+ *           MessageBeep   (USER32.390)
+ */
+BOOL WINAPI MessageBeep( UINT i )
+{
+    USER_Driver->pBeep();
+    return TRUE;
+}