diff --git a/windows/cursoricon.c b/windows/cursoricon.c
index 5b59686..afcca46 100644
--- a/windows/cursoricon.c
+++ b/windows/cursoricon.c
@@ -52,8 +52,9 @@
 #include "message.h"
 #include "winerror.h"
 
-DECLARE_DEBUG_CHANNEL(cursor)
-DECLARE_DEBUG_CHANNEL(icon)
+DECLARE_DEBUG_CHANNEL(cursor);
+DECLARE_DEBUG_CHANNEL(icon);
+DECLARE_DEBUG_CHANNEL(resource);
 
 static HCURSOR hActiveCursor = 0;  /* Active cursor */
 static INT CURSOR_ShowCount = 0;   /* Cursor display count */
@@ -2016,3 +2017,246 @@
     GlobalUnlock16( hIcon );
     return result;
 }
+
+/**********************************************************************
+ *       BITMAP_Load
+ */
+static HBITMAP BITMAP_Load( HINSTANCE instance,LPCWSTR name, UINT loadflags )
+{
+    HBITMAP hbitmap = 0;
+    HDC hdc;
+    HRSRC hRsrc;
+    HGLOBAL handle;
+    char *ptr = NULL;
+    BITMAPINFO *info, *fix_info=NULL;
+    HGLOBAL hFix;
+    int size;
+
+    if (!(loadflags & LR_LOADFROMFILE)) {
+      if (!instance)  /* OEM bitmap */
+      {
+          HDC hdc;
+	  DC *dc;
+
+	  if (HIWORD((int)name)) return 0;
+	  hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
+	  dc = DC_GetDCPtr( hdc );
+	  if(dc->funcs->pLoadOEMResource)
+	      hbitmap = dc->funcs->pLoadOEMResource( LOWORD((int)name), 
+						     OEM_BITMAP );
+	  GDI_HEAP_UNLOCK( hdc );
+	  DeleteDC( hdc );
+	  return hbitmap;
+      }
+
+      if (!(hRsrc = FindResourceW( instance, name, RT_BITMAPW ))) return 0;
+      if (!(handle = LoadResource( instance, hRsrc ))) return 0;
+
+      if ((info = (BITMAPINFO *)LockResource( handle )) == NULL) return 0;
+    }
+    else
+    {
+        if (!(ptr = (char *)VIRTUAL_MapFileW( name ))) return 0;
+        info = (BITMAPINFO *)(ptr + sizeof(BITMAPFILEHEADER));
+    }
+    size = DIB_BitmapInfoSize(info, DIB_RGB_COLORS);
+    if ((hFix = GlobalAlloc(0, size))) fix_info=GlobalLock(hFix);
+    if (fix_info) {
+      BYTE pix;
+
+      memcpy(fix_info, info, size);
+      pix = *((LPBYTE)info+DIB_BitmapInfoSize(info, DIB_RGB_COLORS));
+      DIB_FixColorsToLoadflags(fix_info, loadflags, pix);
+      if ((hdc = GetDC(0)) != 0) {
+        char *bits = (char *)info + size;
+	if (loadflags & LR_CREATEDIBSECTION) {
+          DIBSECTION dib;
+	  hbitmap = CreateDIBSection(hdc, fix_info, DIB_RGB_COLORS, NULL, 0, 0);
+          GetObjectA(hbitmap, sizeof(DIBSECTION), &dib);
+          SetDIBits(hdc, hbitmap, 0, dib.dsBm.bmHeight, bits, info, 
+                    DIB_RGB_COLORS);
+        }
+        else {
+          hbitmap = CreateDIBitmap( hdc, &fix_info->bmiHeader, CBM_INIT,
+                                      bits, fix_info, DIB_RGB_COLORS );
+	}
+        ReleaseDC( 0, hdc );
+      }
+      GlobalUnlock(hFix);
+      GlobalFree(hFix);
+    }
+    if (loadflags & LR_LOADFROMFILE) UnmapViewOfFile( ptr );
+    return hbitmap;
+}
+
+
+/***********************************************************************
+ * LoadImage16 [USER.389]
+ *
+ */
+HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type,
+                             INT16 desiredx, INT16 desiredy, UINT16 loadflags)
+{
+    LPCSTR nameStr = HIWORD(name)? PTR_SEG_TO_LIN(name) : (LPCSTR)name;
+    return LoadImageA( hinst, nameStr, type, 
+                       desiredx, desiredy, loadflags );
+}
+
+/**********************************************************************
+ *	    LoadImageA    (USER32.365)
+ * 
+ * FIXME: implementation lacks some features, see LR_ defines in windows.h
+ */
+
+HANDLE WINAPI LoadImageA( HINSTANCE hinst, LPCSTR name, UINT type,
+                              INT desiredx, INT desiredy, UINT loadflags)
+{
+    HANDLE res;
+    LPWSTR u_name;
+
+    if (HIWORD(name)) u_name = HEAP_strdupAtoW(GetProcessHeap(), 0, name);
+    else u_name=(LPWSTR)name;
+    res = LoadImageW(hinst, u_name, type, desiredx, desiredy, loadflags);
+    if (HIWORD(name)) HeapFree(GetProcessHeap(), 0, u_name);
+    return res;
+}
+
+
+/******************************************************************************
+ * LoadImageW [USER32.366]  Loads an icon, cursor, or bitmap
+ *
+ * PARAMS
+ *    hinst     [I] Handle of instance that contains image
+ *    name      [I] Name of image
+ *    type      [I] Type of image
+ *    desiredx  [I] Desired width
+ *    desiredy  [I] Desired height
+ *    loadflags [I] Load flags
+ *
+ * RETURNS
+ *    Success: Handle to newly loaded image
+ *    Failure: NULL
+ *
+ * FIXME: Implementation lacks some features, see LR_ defines in windows.h
+ */
+HANDLE WINAPI LoadImageW( HINSTANCE hinst, LPCWSTR name, UINT type,
+                INT desiredx, INT desiredy, UINT loadflags )
+{
+    if (HIWORD(name)) {
+        TRACE_(resource)("(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+	      hinst,name,type,desiredx,desiredy,loadflags);
+    } else {
+        TRACE_(resource)("(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+	      hinst,name,type,desiredx,desiredy,loadflags);
+    }
+    if (loadflags & LR_DEFAULTSIZE) {
+        if (type == IMAGE_ICON) {
+	    if (!desiredx) desiredx = GetSystemMetrics(SM_CXICON);
+	    if (!desiredy) desiredy = GetSystemMetrics(SM_CYICON);
+	} else if (type == IMAGE_CURSOR) {
+            if (!desiredx) desiredx = GetSystemMetrics(SM_CXCURSOR);
+	    if (!desiredy) desiredy = GetSystemMetrics(SM_CYCURSOR);
+	}
+    }
+    if (loadflags & LR_LOADFROMFILE) loadflags &= ~LR_SHARED;
+    switch (type) {
+    case IMAGE_BITMAP:
+        return BITMAP_Load( hinst, name, loadflags );
+
+    case IMAGE_ICON:
+        {
+	HDC hdc = GetDC(0);
+	UINT palEnts = GetSystemPaletteEntries(hdc, 0, 0, NULL);
+	if (palEnts == 0)
+	    palEnts = 256;
+	ReleaseDC(0, hdc);
+
+	return CURSORICON_Load(hinst, name, desiredx, desiredy,
+				 palEnts, FALSE, loadflags);
+	}
+
+    case IMAGE_CURSOR:
+        return CURSORICON_Load(hinst, name, desiredx, desiredy,
+				 1, TRUE, loadflags);
+    }
+    return 0;
+}
+
+
+/******************************************************************************
+ * CopyImage16 [USER.390]  Creates new image and copies attributes to it
+ *
+ */
+HICON16 WINAPI CopyImage16( HANDLE16 hnd, UINT16 type, INT16 desiredx,
+                             INT16 desiredy, UINT16 flags )
+{
+    return (HICON16)CopyImage((HANDLE)hnd, (UINT)type, (INT)desiredx,
+                                (INT)desiredy, (UINT)flags);
+}
+
+/******************************************************************************
+ * CopyImage32 [USER32.61]  Creates new image and copies attributes to it
+ *
+ * PARAMS
+ *    hnd      [I] Handle to image to copy
+ *    type     [I] Type of image to copy
+ *    desiredx [I] Desired width of new image
+ *    desiredy [I] Desired height of new image
+ *    flags    [I] Copy flags
+ *
+ * RETURNS
+ *    Success: Handle to newly created image
+ *    Failure: NULL
+ *
+ * FIXME: implementation still lacks nearly all features, see LR_*
+ * defines in windows.h
+ */
+HICON WINAPI CopyImage( HANDLE hnd, UINT type, INT desiredx,
+                             INT desiredy, UINT flags )
+{
+    switch (type)
+    {
+	case IMAGE_BITMAP:
+		return BITMAP_CopyBitmap(hnd);
+	case IMAGE_ICON:
+		return CURSORICON_ExtCopy(hnd,type, desiredx, desiredy, flags);
+	case IMAGE_CURSOR:
+		/* Should call CURSORICON_ExtCopy but more testing
+		 * needs to be done before we change this
+		 */
+		return CopyCursor(hnd);
+    }
+    return 0;
+}
+
+
+/******************************************************************************
+ * LoadBitmapW [USER32.358]  Loads bitmap from the executable file
+ *
+ * RETURNS
+ *    Success: Handle to specified bitmap
+ *    Failure: NULL
+ */
+HBITMAP WINAPI LoadBitmapW(
+    HINSTANCE instance, /* [in] Handle to application instance */
+    LPCWSTR name)         /* [in] Address of bitmap resource name */
+{
+    return LoadImageW( instance, name, IMAGE_BITMAP, 0, 0, 0 );
+}
+
+/**********************************************************************
+ *	    LoadBitmapA   (USER32.357)
+ */
+HBITMAP WINAPI LoadBitmapA( HINSTANCE instance, LPCSTR name )
+{
+    return LoadImageA( instance, name, IMAGE_BITMAP, 0, 0, 0 );
+}
+
+/**********************************************************************
+ *	    LoadBitmap16    (USER.175)
+ */
+HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
+{
+    LPCSTR nameStr = HIWORD(name)? PTR_SEG_TO_LIN(name) : (LPCSTR)name;
+    return LoadBitmapA( instance, nameStr );
+}
