diff --git a/dlls/user/user16.c b/dlls/user/user16.c
index faf33bf..04b62bc 100644
--- a/dlls/user/user16.c
+++ b/dlls/user/user16.c
@@ -21,6 +21,90 @@
 #include "wine/winuser16.h"
 #include "winbase.h"
 
+/* handle to handle 16 conversions */
+#define HANDLE_16(h32)		(LOWORD(h32))
+#define HBITMAP_16(h32)		(LOWORD(h32))
+#define HCURSOR_16(h32)		(LOWORD(h32))
+#define HICON_16(h32)		(LOWORD(h32))
+
+/* handle16 to handle conversions */
+#define HANDLE_32(h16)		((HANDLE)(ULONG_PTR)(h16))
+#define HBRUSH_32(h16)		((HBRUSH)(ULONG_PTR)(h16))
+#define HCURSOR_32(h16)		((HCURSOR)(ULONG_PTR)(h16))
+#define HDC_32(h16)		((HDC)(ULONG_PTR)(h16))
+#define HICON_32(h16)		((HICON)(ULONG_PTR)(h16))
+#define HINSTANCE_32(h16)	((HINSTANCE)(ULONG_PTR)(h16))
+
+WORD WINAPI DestroyIcon32(HGLOBAL16, UINT16);
+
+
+/***********************************************************************
+ *		SetCursor (USER.69)
+ */
+HCURSOR16 WINAPI SetCursor16(HCURSOR16 hCursor)
+{
+  return HCURSOR_16(SetCursor(HCURSOR_32(hCursor)));
+}
+
+/***********************************************************************
+ *		ShowCursor (USER.71)
+ */
+INT16 WINAPI ShowCursor16(BOOL16 bShow)
+{
+  return ShowCursor(bShow);
+}
+
+/***********************************************************************
+ *		DrawIcon (USER.84)
+ */
+BOOL16 WINAPI DrawIcon16(HDC16 hdc, INT16 x, INT16 y, HICON16 hIcon)
+{
+  return DrawIcon(HDC_32(hdc), x, y, HICON_32(hIcon));
+}
+
+/***********************************************************************
+ *		IconSize (USER.86)
+ *
+ * See "Undocumented Windows". Used by W2.0 paint.exe.
+ */
+DWORD WINAPI IconSize16(void)
+{
+  return MAKELONG(GetSystemMetrics(SM_CYICON), GetSystemMetrics(SM_CXICON));
+}
+
+/***********************************************************************
+ *		LoadCursor (USER.173)
+ */
+HCURSOR16 WINAPI LoadCursor16(HINSTANCE16 hInstance, LPCSTR name)
+{
+  return HCURSOR_16(LoadCursorA(HINSTANCE_32(hInstance), name));
+}
+
+
+/***********************************************************************
+ *		LoadIcon (USER.174)
+ */
+HICON16 WINAPI LoadIcon16(HINSTANCE16 hInstance, LPCSTR name)
+{
+  return HICON_16(LoadIconA(HINSTANCE_32(hInstance), name));
+}
+
+/**********************************************************************
+ *		LoadBitmap (USER.175)
+ */
+HBITMAP16 WINAPI LoadBitmap16(HINSTANCE16 hInstance, LPCSTR name)
+{
+  return HBITMAP_16(LoadBitmapA(HINSTANCE_32(hInstance), name));
+}
+
+/***********************************************************************
+ *		GetCursor (USER.247)
+ */
+HCURSOR16 WINAPI GetCursor16(void)
+{
+  return HCURSOR_16(GetCursor());
+}
+
 /***********************************************************************
  *		GlobalAddAtom (USER.268)
  */
@@ -52,3 +136,104 @@
 {
   return GlobalGetAtomNameA(nAtom, lpBuffer, nSize);
 }
+
+/***********************************************************************
+ *		LoadImage (USER.389)
+ *
+ */
+HANDLE16 WINAPI LoadImage16(HINSTANCE16 hinst, LPCSTR name, UINT16 type,
+			    INT16 desiredx, INT16 desiredy, UINT16 loadflags)
+{
+  return HANDLE_16(LoadImageA(HINSTANCE_32(hinst), name, type, desiredx,
+			      desiredy, loadflags));
+}
+
+/******************************************************************************
+ *		CopyImage (USER.390) Creates new image and copies attributes to it
+ *
+ */
+HICON16 WINAPI CopyImage16(HANDLE16 hnd, UINT16 type, INT16 desiredx,
+			   INT16 desiredy, UINT16 flags)
+{
+  return HICON_16(CopyImage(HANDLE_32(hnd), (UINT)type, (INT)desiredx,
+			    (INT)desiredy, (UINT)flags));
+}
+
+/**********************************************************************
+ *		DrawIconEx (USER.394)
+ */
+BOOL16 WINAPI DrawIconEx16(HDC16 hdc, INT16 xLeft, INT16 yTop, HICON16 hIcon,
+			   INT16 cxWidth, INT16 cyWidth, UINT16 istep,
+			   HBRUSH16 hbr, UINT16 flags)
+{
+  return DrawIconEx(HDC_32(hdc), xLeft, yTop, HICON_32(hIcon), cxWidth, cyWidth,
+		    istep, HBRUSH_32(hbr), flags);
+}
+
+/**********************************************************************
+ *		GetIconInfo (USER.395)
+ */
+BOOL16 WINAPI GetIconInfo16(HICON16 hIcon, LPICONINFO16 iconinfo)
+{
+  ICONINFO ii32;
+  BOOL16 ret = GetIconInfo(HICON_32(hIcon), &ii32);
+
+  iconinfo->fIcon = ii32.fIcon;
+  iconinfo->xHotspot = ii32.xHotspot;
+  iconinfo->yHotspot = ii32.yHotspot;
+  iconinfo->hbmMask = ii32.hbmMask;
+  iconinfo->hbmColor = ii32.hbmColor;
+  return ret;
+}
+
+/***********************************************************************
+ *		CreateCursor (USER.406)
+ */
+HCURSOR16 WINAPI CreateCursor16(HINSTANCE16 hInstance,
+				INT16 xHotSpot, INT16 yHotSpot,
+				INT16 nWidth, INT16 nHeight,
+				LPCVOID lpANDbits, LPCVOID lpXORbits)
+{
+  CURSORICONINFO info;
+
+  info.ptHotSpot.x = xHotSpot;
+  info.ptHotSpot.y = yHotSpot;
+  info.nWidth = nWidth;
+  info.nHeight = nHeight;
+  info.nWidthBytes = 0;
+  info.bPlanes = 1;
+  info.bBitsPerPixel = 1;
+
+  return CreateCursorIconIndirect16(HINSTANCE_32(hInstance), &info, lpANDbits,
+				    lpXORbits);
+}
+
+/**********************************************************************
+ *		CreateIconFromResourceEx (USER.450)
+ *
+ * FIXME: not sure about exact parameter types
+ */
+HICON16 WINAPI CreateIconFromResourceEx16(LPBYTE bits, UINT16 cbSize,
+					  BOOL16 bIcon, DWORD dwVersion,
+					  INT16 width, INT16 height,
+					  UINT16 cFlag)
+{
+  return HICON_16(CreateIconFromResourceEx(bits, cbSize, bIcon, dwVersion,
+					   width, height, cFlag));
+}
+
+/***********************************************************************
+ *		DestroyIcon (USER.457)
+ */
+BOOL16 WINAPI DestroyIcon16(HICON16 hIcon)
+{
+  return DestroyIcon32(hIcon, 0);
+}
+
+/***********************************************************************
+ *		DestroyCursor (USER.458)
+ */
+BOOL16 WINAPI DestroyCursor16(HCURSOR16 hCursor)
+{
+  return DestroyIcon32(hCursor, 0);
+}
diff --git a/windows/cursoricon.c b/windows/cursoricon.c
index b581de6..14d8aa4 100644
--- a/windows/cursoricon.c
+++ b/windows/cursoricon.c
@@ -691,19 +691,6 @@
 
 
 /**********************************************************************
- *		CreateIconFromResourceEx (USER.450)
- *
- * FIXME: not sure about exact parameter types
- */
-HICON16 WINAPI CreateIconFromResourceEx16( LPBYTE bits, UINT16 cbSize, BOOL16 bIcon,
-                                    DWORD dwVersion, INT16 width, INT16 height, UINT16 cFlag )
-{
-    return CreateIconFromResourceEx(bits, cbSize, bIcon, dwVersion,
-      width, height, cFlag);
-}
-
-
-/**********************************************************************
  *		CreateIconFromResource (USER32.@)
  */
 HICON WINAPI CreateIconFromResource( LPBYTE bits, UINT cbSize,
@@ -986,49 +973,6 @@
 
 
 /***********************************************************************
- *		LoadCursor (USER.173)
- */
-HCURSOR16 WINAPI LoadCursor16( HINSTANCE16 hInstance, LPCSTR name )
-{
-    return LoadCursorA( hInstance, name );
-}
-
-
-/***********************************************************************
- *		LoadIcon (USER.174)
- */
-HICON16 WINAPI LoadIcon16( HINSTANCE16 hInstance, LPCSTR name )
-{
-    return LoadIconA( hInstance, name );
-}
-
-
-/***********************************************************************
- *		CreateCursor (USER.406)
- */
-HCURSOR16 WINAPI CreateCursor16( HINSTANCE16 hInstance,
-                                 INT16 xHotSpot, INT16 yHotSpot,
-                                 INT16 nWidth, INT16 nHeight,
-                                 LPCVOID lpANDbits, LPCVOID lpXORbits )
-{
-    CURSORICONINFO info;
-
-    TRACE_(cursor)("%dx%d spot=%d,%d xor=%p and=%p\n",
-                    nWidth, nHeight, xHotSpot, yHotSpot, lpXORbits, lpANDbits);
-
-    info.ptHotSpot.x = xHotSpot;
-    info.ptHotSpot.y = yHotSpot;
-    info.nWidth = nWidth;
-    info.nHeight = nHeight;
-    info.nWidthBytes = 0;
-    info.bPlanes = 1;
-    info.bBitsPerPixel = 1;
-
-    return CreateCursorIconIndirect16( hInstance, &info, lpANDbits, lpXORbits );
-}
-
-
-/***********************************************************************
  *		CreateCursor (USER32.@)
  */
 HCURSOR WINAPI CreateCursor( HINSTANCE hInstance,
@@ -1274,14 +1218,6 @@
 }
 
 /***********************************************************************
- *		DestroyIcon (USER.457)
- */
-BOOL16 WINAPI DestroyIcon16( HICON16 hIcon )
-{
-    return DestroyIcon32( hIcon, 0 );
-}
-
-/***********************************************************************
  *		DestroyIcon (USER32.@)
  */
 BOOL WINAPI DestroyIcon( HICON hIcon )
@@ -1289,13 +1225,6 @@
     return DestroyIcon32( hIcon, CID_WIN32 );
 }
 
-/***********************************************************************
- *		DestroyCursor (USER.458)
- */
-BOOL16 WINAPI DestroyCursor16( HCURSOR16 hCursor )
-{
-    return DestroyIcon32( hCursor, 0 );
-}
 
 /***********************************************************************
  *		DestroyCursor (USER32.@)
@@ -1307,15 +1236,6 @@
 
 
 /***********************************************************************
- *		DrawIcon (USER.84)
- */
-BOOL16 WINAPI DrawIcon16( HDC16 hdc, INT16 x, INT16 y, HICON16 hIcon )
-{
-    return DrawIcon( hdc, x, y, hIcon );
-}
-
-
-/***********************************************************************
  *		DrawIcon (USER32.@)
  */
 BOOL WINAPI DrawIcon( HDC hdc, INT x, INT y, HICON hIcon )
@@ -1352,18 +1272,6 @@
     return TRUE;
 }
 
-
-/***********************************************************************
- *		IconSize (USER.86)
- *
- * See "Undocumented Windows". Used by W2.0 paint.exe.
- */
-DWORD WINAPI IconSize16( void )
-{
-    return MAKELONG(GetSystemMetrics(SM_CYICON), GetSystemMetrics(SM_CXICON));
-}
-
-
 /***********************************************************************
  *		DumpIcon (USER.459)
  */
@@ -1384,15 +1292,6 @@
 
 
 /***********************************************************************
- *		SetCursor (USER.69)
- */
-HCURSOR16 WINAPI SetCursor16( HCURSOR16 hCursor )
-{
-    return (HCURSOR16)SetCursor( hCursor );
-}
-
-
-/***********************************************************************
  *		SetCursor (USER32.@)
  * RETURNS:
  *	A handle to the previous cursor shape.
@@ -1415,16 +1314,6 @@
     return hOldCursor;
 }
 
-
-/***********************************************************************
- *		ShowCursor (USER.71)
- */
-INT16 WINAPI ShowCursor16( BOOL16 bShow )
-{
-    return ShowCursor( bShow );
-}
-
-
 /***********************************************************************
  *		ShowCursor (USER32.@)
  */
@@ -1450,16 +1339,6 @@
     return queue->cursor_count;
 }
 
-
-/***********************************************************************
- *		GetCursor (USER.247)
- */
-HCURSOR16 WINAPI GetCursor16(void)
-{
-    return GetCursor();
-}
-
-
 /***********************************************************************
  *		GetCursor (USER32.@)
  */
@@ -1724,22 +1603,6 @@
 }
 
 /**********************************************************************
- *		GetIconInfo (USER.395)
- */
-BOOL16 WINAPI GetIconInfo16(HICON16 hIcon,LPICONINFO16 iconinfo)
-{
-    ICONINFO	ii32;
-    BOOL16	ret = GetIconInfo((HICON)hIcon, &ii32);
-
-    iconinfo->fIcon = ii32.fIcon;
-    iconinfo->xHotspot = ii32.xHotspot;
-    iconinfo->yHotspot = ii32.yHotspot;
-    iconinfo->hbmMask = ii32.hbmMask;
-    iconinfo->hbmColor = ii32.hbmColor;
-    return ret;
-}
-
-/**********************************************************************
  *		GetIconInfo (USER32.@)
  */
 BOOL WINAPI GetIconInfo(HICON hIcon,PICONINFO iconinfo) {
@@ -1826,19 +1689,6 @@
     return hObj;
 }
 
-
-/**********************************************************************
- *		DrawIconEx (USER.394)
- */
-BOOL16 WINAPI DrawIconEx16 (HDC16 hdc, INT16 xLeft, INT16 yTop, HICON16 hIcon,
-			    INT16 cxWidth, INT16 cyWidth, UINT16 istep,
-			    HBRUSH16 hbr, UINT16 flags)
-{
-    return DrawIconEx(hdc, xLeft, yTop, hIcon, cxWidth, cyWidth,
-                        istep, hbr, flags);
-}
-
-
 /******************************************************************************
  *		DrawIconEx (USER32.@) Draws an icon or cursor on device context
  *
@@ -2108,17 +1958,6 @@
     return hbitmap;
 }
 
-
-/***********************************************************************
- *		LoadImage (USER.389)
- *
- */
-HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type,
-                             INT16 desiredx, INT16 desiredy, UINT16 loadflags)
-{
-    return LoadImageA( hinst, name, type, desiredx, desiredy, loadflags );
-}
-
 /**********************************************************************
  *		LoadImageA (USER32.@)
  *
@@ -2219,18 +2058,6 @@
     return 0;
 }
 
-
-/******************************************************************************
- *		CopyImage (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);
-}
-
 /******************************************************************************
  *		CopyImage (USER32.@) Creates new image and copies attributes to it
  *
@@ -2302,11 +2129,3 @@
 {
     return LoadImageA( instance, name, IMAGE_BITMAP, 0, 0, 0 );
 }
-
-/**********************************************************************
- *		LoadBitmap (USER.175)
- */
-HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, LPCSTR name )
-{
-    return LoadBitmapA( instance, name );
-}
