diff --git a/ANNOUNCE b/ANNOUNCE
index e9201d2..6485e58 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,12 @@
-This is release 960314 of Wine the MS Windows emulator.  This is still a
+This is release 960324 of Wine the MS Windows emulator.  This is still a
 developer's only release.  There are many bugs and many unimplemented API
 features.  Most applications still do not work.
 
 Patches should be submitted to "julliard@lrc.epfl.ch".  Please don't
 forget to include a ChangeLog entry.
 
-WHAT'S NEW with Wine-960314: (see ChangeLog for details)
-	- Many combo and listbox fixes.
-	- Win32 exception handling.
+WHAT'S NEW with Wine-960324: (see ChangeLog for details)
+	- Many Win32 and Winelib improvements.
 	- Lots of bug fixes.
 
 See the README file in the distribution for installation instructions.
@@ -16,10 +15,10 @@
 the release is available at the ftp sites.  The sources will be available
 from the following locations:
 
-    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960314.tar.gz
-    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960314.tar.gz
-    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960314.tar.gz
-    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960314.tar.gz
+    sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960324.tar.gz
+    tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960324.tar.gz
+    ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960324.tar.gz
+    aris.com:/pub/linux/ALPHA/Wine/development/Wine-960324.tar.gz
 
 It should also be available from any site that mirrors tsx-11 or sunsite.
 
diff --git a/ChangeLog b/ChangeLog
index 9374983..687c402 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,90 @@
 ----------------------------------------------------------------------
+Sun Mar 24 13:13:11 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
+
+	* [include/win.h] [windows/*.c]
+	Replaced next, parent, child and owner handles by pointers in WND
+	structure. This should improve performance, and should be
+	reasonably safe since Microsoft did the same in Win95.
+
+	* [include/wintypes.h] [*/*]
+	Redefined HANDLE to be UINT instead of a pointer for Winelib. This
+	allows removing a lot of unnecessary casts and NPFMTs.
+
+	* [windows/caret.c]
+	Create the caret brush upon CreateCaret(); use the bitmap
+	dimensions for the caret.
+	Fixed CARET_DisplayCaret() to use PatBlt().
+
+Fri Mar 22 16:00:00 1996  Anand Kumria <akumria@ozemail.com.au>
+
+	* [misc/winsocket.c]
+	More sanity checks, fixup some erroneous return codes.
+
+	* [documentation/winsock]
+	Description of how compatible the winsock is currently.
+
+Fri Mar 22 13:05:34 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* [library/winmain.c]
+	Set `lpszCmdParam' by concatenating arguments.
+
+	* [loader/module.c]
+	WinExec: accept Unix commands, use Wine emulator.
+
+Mon Mar 18 12:16:27 1996  Martin von Loewis <loewis@informatik.hu-berlin.de>
+
+	* [if1632/kernel32.spec][win32/thread.c][include/kernel32.h]
+	DeleteCriticalSection, EnterCriticalSection,
+ 	InitializeCriticalSection, LeaveCriticalSection, TlsAlloc,
+ 	TlsFree, TlsGetValue, TlsSetValue: new functions.
+	CRITICAL_SECTION: new structure.
+
+	* [if1632/kernel32.spec][win32/code_page.c]
+	WideCharToMultiByte: new function.
+
+	* [if1632/kernel32.spec][win32/file.c]
+	GetFileAttributesA: new function.
+
+	* [if1632/kernel32.spec][misc/main.c]
+	GetEnvironmentStringsW, FreeEnvironmentStringsA,
+ 	FreeEnvironmentStringsW: new functions.
+	
+	* [if1632/user.spec][win32/cursoricon32.c][win32/Makefile.in]
+	cursoricon32.c: new file.
+	LoadCursorA, LoadCursorW: modified implementation from LoadCursor
+ 	to WIN32_*.
+	LoadIconA, LoadIconW: modified implementation from LoadIconA32
+	to WIN32_*.
+
+	* [include/struct32.h]
+	pragma pack inserted.
+	CURSORICON32 structures added.
+
+	* [include/winnls.h]
+	Constants CP_* and WC_* added.
+
+	* [loader/pe_image.c]
+	PE_LoadModule: call PE_InitDLL with hModule rather than wpnt.
+
+Sun Mar 17 16:59:12 1996  Albrecht Kleine  <kleine@ak.sax.de>
+
+	* [misc/commdlg.c]
+	Introduced hook function handling in file dialog.
+	Removed an unnecessary ShowWindow call in FILEDLG_WMCommand().
+
+Thu Mar 14 10:50:00 1996  Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk>
+
+	* [if1632/gdi32.spec]
+	Added GetNearestColor.
+
+	* [if1632/kernel32.spec]
+	Added GlobalAddAtomA.
+
+	* [win32/param32.c]
+	Added stackframe.h to includes.
+	WIN32_GlobalAddAtomA() - new function.
+
+----------------------------------------------------------------------
 Wed Mar 13 19:46:50 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>
 
 	* [controls/edit.c]
diff --git a/configure b/configure
index 4e497a1..361565b 100755
--- a/configure
+++ b/configure
@@ -2,8 +2,8 @@
 
 # From configure.in configure.in 1.00
 # Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.8 
-# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+# Generated automatically using autoconf version 2.9 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
 #
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
@@ -341,7 +341,7 @@
     verbose=yes ;;
 
   -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.8"
+    echo "configure generated by autoconf version 2.9"
     exit 0 ;;
 
   -with-* | --with-*)
@@ -1089,13 +1089,15 @@
 cat > conftest.$ac_ext <<EOF
 #line 1091 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char IceConnectionNumber();
 
 int main() { return 0; }
 int t() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:1099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1131,15 +1133,17 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1135 "configure"
+#line 1137 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char dnet_ntoa();
 
 int main() { return 0; }
 int t() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1147: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1157,7 +1161,7 @@
   echo "$ac_t""no" 1>&6
 fi
 
-    if test $ac_cv_lib_dnet = no; then
+    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6
 ac_lib_var=`echo dnet_stub_dnet_ntoa | tr '.-/+' '___p'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
@@ -1166,15 +1170,17 @@
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1170 "configure"
+#line 1174 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char dnet_ntoa();
 
 int main() { return 0; }
 int t() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1206,15 +1212,17 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1210 "configure"
+#line 1216 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char t_accept();
 
 int main() { return 0; }
 int t() {
 t_accept()
 ; return 0; }
 EOF
-if { (eval echo configure:1218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1226: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1245,15 +1253,17 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1249 "configure"
+#line 1257 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char socket();
 
 int main() { return 0; }
 int t() {
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:1257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1350,15 +1360,17 @@
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1354 "configure"
+#line 1364 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char yywrap();
 
 int main() { return 0; }
 int t() {
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:1362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1374: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1473,15 +1485,17 @@
   ac_save_LIBS="$LIBS"
 LIBS="-li386  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1477 "configure"
+#line 1489 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+char i386_set_ldt();
 
 int main() { return 0; }
 int t() {
 i386_set_ldt()
 ; return 0; }
 EOF
-if { (eval echo configure:1485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1513,11 +1527,11 @@
   ac_cv_c_cross=yes
 else
 cat > conftest.$ac_ext <<EOF
-#line 1517 "configure"
+#line 1531 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
-{ (eval echo configure:1521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
+{ (eval echo configure:1535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
 if test -s conftest && (./conftest; exit) 2>/dev/null; then
   ac_cv_c_cross=no
 else
@@ -1538,7 +1552,7 @@
   ac_cv_c_gcc_strength_bug="yes"
 else
 cat > conftest.$ac_ext <<EOF
-#line 1542 "configure"
+#line 1556 "configure"
 #include "confdefs.h"
 
 int main(void) {
@@ -1549,7 +1563,7 @@
   exit( Array[1] != -2 );
 }
 EOF
-{ (eval echo configure:1553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
+{ (eval echo configure:1567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
 if test -s conftest && (./conftest; exit) 2>/dev/null; then
   ac_cv_c_gcc_strength_bug="no"
 else
@@ -1574,7 +1588,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1578 "configure"
+#line 1592 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1596,7 +1610,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1626,12 +1640,12 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1630 "configure"
+#line 1644 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1635: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1649: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1660,7 +1674,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1664 "configure"
+#line 1678 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -1715,7 +1729,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1719 "configure"
+#line 1733 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1765,7 +1779,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:1769: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1783: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -1789,7 +1803,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1793 "configure"
+#line 1807 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1797,7 +1811,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1801: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1812,7 +1826,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1816 "configure"
+#line 1830 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1830,7 +1844,7 @@
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1834 "configure"
+#line 1848 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1851,7 +1865,7 @@
   :
 else
 cat > conftest.$ac_ext <<EOF
-#line 1855 "configure"
+#line 1869 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1862,7 +1876,7 @@
 exit (0); }
 
 EOF
-{ (eval echo configure:1866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
+{ (eval echo configure:1880: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
 if test -s conftest && (./conftest; exit) 2>/dev/null; then
   :
 else
@@ -1886,7 +1900,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1890 "configure"
+#line 1904 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2005,7 +2019,7 @@
     echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
     exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
   -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.8"
+    echo "$CONFIG_STATUS generated by autoconf version 2.9"
     exit 0 ;;
   -help | --help | --hel | --he | --h)
     echo "\$ac_cs_usage"; exit 0 ;;
diff --git a/controls/button.c b/controls/button.c
index 9310643..80bd0f4 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -161,8 +161,7 @@
                     }
 #ifdef WINELIB32
                     SendMessage( GetParent(hWnd), WM_COMMAND,
-                                 MAKEWPARAM(wndPtr->wIDmenu,BN_CLICKED),
-				 (LPARAM) hWnd );
+                                 MAKEWPARAM(wndPtr->wIDmenu,BN_CLICKED), hWnd);
 #else
                     SendMessage( GetParent(hWnd), WM_COMMAND,
                                  wndPtr->wIDmenu, MAKELPARAM(hWnd,BN_CLICKED));
@@ -199,7 +198,7 @@
                 break;
 
         case WM_GETFONT:
-                return (LONG) infoPtr->hFont;
+                return infoPtr->hFont;
 
 	case WM_SETFOCUS:
                 infoPtr->state |= BUTTON_HASFOCUS;
@@ -281,8 +280,7 @@
       /* Send WM_CTLCOLOR to allow changing the font (the colors are fixed) */
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
 #ifdef WINELIB32
-    SendMessage( GetParent(hButton), WM_CTLCOLORBTN,
-		 (WPARAM)hDC, (LPARAM)hButton );
+    SendMessage( GetParent(hButton), WM_CTLCOLORBTN, hDC, hButton );
 #else
     SendMessage( GetParent(hButton), WM_CTLCOLOR, (WORD)hDC,
                  MAKELPARAM(hButton, CTLCOLOR_BTN) );
@@ -340,8 +338,8 @@
         }
     }
 
-    SelectObject(hDC, (HANDLE)hOldPen);
-    SelectObject(hDC, (HANDLE)hOldBrush);
+    SelectObject( hDC, hOldPen );
+    SelectObject( hDC, hOldBrush );
 }
 
 
@@ -364,10 +362,9 @@
 
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
 #ifdef WINELIB32 /* JBP: Different in Win32 */
-    hBrush = (HBRUSH) SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC,
-				  (LPARAM)hWnd);
+    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, hDC, hWnd);
 #else
-    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+    hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
 #endif
     if (action == ODA_DRAWENTIRE) FillRect(hDC, &rc, hBrush);
@@ -444,9 +441,9 @@
 
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
 #ifdef WINELIB32
-    SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hWnd );
+    SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, hDC, hWnd );
 #else
-    SendMessage( GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
+    SendMessage( GetParent(hWnd), WM_CTLCOLOR, hDC,
 		 MAKELPARAM(hWnd, CTLCOLOR_BTN));
 #endif
     SelectObject( hDC, sysColorObjects.hpenWindowFrame );
@@ -487,8 +484,7 @@
 
     if (infoPtr->hFont) SelectObject( hDC, infoPtr->hFont );
 #ifdef WINELIB32
-    hBrush = (HBRUSH) SendMessage(GetParent(hWnd), WM_CTLCOLORBTN, (WPARAM)hDC,
-				  (LPARAM)hWnd);
+    hBrush = SendMessage( GetParent(hWnd), WM_CTLCOLORBTN, hDC, hWnd );
 #else
     hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC,
 			 MAKELPARAM(hWnd, CTLCOLOR_BTN));
diff --git a/controls/combo.c b/controls/combo.c
index 338c0c8..f637b0f 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -175,7 +175,7 @@
 				0, 0, WIN_GetWindowInstance(hwnd),
 				(SEGPTR)hwnd );
   ShowWindow(lphc->hWndLBox, SW_HIDE);
-  dprintf_combo(stddeb,"Combo Creation LBox="NPFMT"!\n", lphc->hWndLBox);
+  dprintf_combo(stddeb,"Combo Creation LBox=%04x\n", lphc->hWndLBox);
   return 0;
 }
 
@@ -226,8 +226,7 @@
   hOldFont = SelectObject(hdc, lphl->hFont);
 
 #ifdef WINELIB32
-  hBrush = (HBRUSH) SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, (WPARAM)hdc,
-				(LPARAM)hwnd);
+  hBrush = SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, hdc, hwnd);
 #else
   hBrush = SendMessage(lphl->hParent, WM_CTLCOLOR, hdc,
 		       MAKELONG(hwnd, CTLCOLOR_LISTBOX));
@@ -473,7 +472,7 @@
 
   wRet = ListBoxSetCurSel(lphl, wParam);
 
-  dprintf_combo(stddeb,"CBSetCurSel: hwnd "NPFMT" wp %x lp %lx wRet %d\n",
+  dprintf_combo(stddeb,"CBSetCurSel: hwnd %04x wp %x lp %lx wRet %d\n",
 		hwnd,wParam,lParam,wRet);
 /*  SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);*/
   InvalidateRect(hwnd, NULL, TRUE);
@@ -756,8 +755,7 @@
 
   hOldFont = SelectObject(hdc, lphl->hFont);
 #ifdef WINELIB32
-  hBrush = (HBRUSH) SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, (WPARAM)hdc,
-				(LPARAM)hwnd);
+  hBrush = SendMessage(lphl->hParent, WM_CTLCOLORLISTBOX, hdc, hwnd);
 #else
   hBrush = SendMessage(lphl->hParent, WM_CTLCOLOR, hdc,
 		       MAKELONG(hwnd, CTLCOLOR_LISTBOX));
@@ -783,7 +781,8 @@
       lpls->itemRect.left   = rect.left;
       lpls->itemRect.right  = rect.right;
 
-      dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,(LONG)rect.right,top+height,lpls->itemState);
+      dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",
+                      rect.left,top,rect.right,top+height,lpls->itemState);
       if (lphl->OwnerDrawn) {
 	ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
 	if (lpls->itemState)
@@ -891,7 +890,7 @@
   ListBoxGetItemRect(lphl, wRet, &rectsel);
   GetClientRect(hwnd, &rect);
 
-  dprintf_combo(stddeb,"CBLMouseMove: hwnd "NPFMT" wp %x lp %lx  y %d  if %d wret %d %d,%d-%d,%d\n",
+  dprintf_combo(stddeb,"CBLMouseMove: hwnd %04x wp %x lp %lx  y %d  if %d wret %d %d,%d-%d,%d\n",
 hwnd,wParam,lParam,y,lphl->ItemFocused,wRet,rectsel.left,rectsel.top,rectsel.right,rectsel.bottom);
   
   if ((wParam & MK_LBUTTON) != 0) {
@@ -997,7 +996,7 @@
  */
 BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, INT nIDLBox)
 {
-	fprintf(stdnimp,"DlgDirSelectComboBox("NPFMT", '%s', %d) \n",
+	fprintf(stdnimp,"DlgDirSelectComboBox(%04x, '%s', %d) \n",
 				hDlg, lpStr, nIDLBox);
 	return TRUE;
 }
@@ -1011,7 +1010,7 @@
 {
     INT ret = 0;
 
-    dprintf_combo( stddeb,"DlgDirListComboBox("NPFMT",%08lx,%d,%d,%04X) \n",
+    dprintf_combo( stddeb,"DlgDirListComboBox(%04x,%08lx,%d,%d,%04X) \n",
                    hDlg, (DWORD)path, idCBox, idStatic, wType );
 
     if (idCBox)
diff --git a/controls/edit.c b/controls/edit.c
index 9eeb811..4537c02 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -743,14 +743,14 @@
     /* make sure rectangle is within window */
     if (rc.left >= es->ClientWidth - 1)
     {
-	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.left (%ld) is greater than right edge\n",
-	       (LONG)rc.left);
+	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.left (%d) is greater than right edge\n",
+	       rc.left);
 	return;
     }
     if (rc.right <= 0)
     {
-	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.right (%ld) is less than left edge\n",
-	       (LONG)rc.right);
+	dprintf_edit(stddeb,"EDIT_WriteTextLine: rc.right (%d) is less than left edge\n",
+	       rc.right);
 	return;
     }
     if (y - es->wtop < (rc.top / es->txtht) || 
@@ -2008,8 +2008,8 @@
 	es->textwidth = 0;
 	es->SelBegLine = es->SelBegCol = 0;
 	es->SelEndLine = es->SelEndCol = 0;
-	dprintf_edit(stddeb, "EDIT_SetHandleMsg: handle %04lx, textlen=%d\n",
-		     (DWORD)wParam, es->textlen);
+	dprintf_edit(stddeb, "EDIT_SetHandleMsg: handle %04x, textlen=%d\n",
+		     wParam, es->textlen);
 
 	EDIT_BuildTextPointers(hwnd);
 	es->PaintBkgd = TRUE;
@@ -2353,8 +2353,8 @@
     GetClientRect(hwnd, &rc);
     IntersectClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom);
 
-    dprintf_edit(stddeb,"WM_PAINT: rc=(%ld,%ld), (%ld,%ld)\n", (LONG)rc.left, 
-           (LONG)rc.top, (LONG)rc.right, (LONG)rc.bottom);
+    dprintf_edit(stddeb,"WM_PAINT: rc=(%d,%d), (%d,%d)\n",
+                 rc.left, rc.top, rc.right, rc.bottom);
 
     if (es->PaintBkgd)
 	FillWindow(GetParent(hwnd), hwnd, hdc, (HBRUSH)CTLCOLOR_EDIT);
diff --git a/controls/listbox.c b/controls/listbox.c
index e255cbd..6bba90f 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -1253,7 +1253,7 @@
 {
   LPHEADLIST  lphl = ListBoxGetStorageHeader(hwnd);
 
-  dprintf_listbox(stddeb,"ListBox WM_SETREDRAW hWnd="NPFMT" w=%04X !\n",
+  dprintf_listbox(stddeb,"ListBox WM_SETREDRAW hWnd=%04x w=%04x !\n",
 		  hwnd, wParam);
   lphl->bRedrawFlag = wParam;
 
@@ -1365,8 +1365,8 @@
 
       if( IntersectRect(&scratchRect,&paintRect,&lpls->itemRect) )
        {
-        dprintf_listbox(stddeb,"LBPaint: drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,
-                            (LONG)rect.right,top+height,lpls->itemState);
+        dprintf_listbox(stddeb,"LBPaint: drawing item: %d %d %d %d %d\n",
+                        rect.left,top,rect.right,top+height,lpls->itemState);
 
         if (lphl->OwnerDrawn && (lphl->ItemFocused == i) && GetFocus() == hwnd)
            {
@@ -1401,7 +1401,7 @@
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
-  dprintf_listbox(stddeb,"ListBox WM_SETFOCUS for "NPFMT"\n",hwnd);
+  dprintf_listbox(stddeb,"ListBox WM_SETFOCUS for %04x\n",hwnd);
   if(!(lphl->dwStyle & LBS_MULTIPLESEL) )
        if( lphl->ItemsCount && lphl->ItemFocused != -1)
          {
@@ -1429,7 +1429,7 @@
 {
   LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
 
-  dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS for "NPFMT"\n",hwnd);
+  dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS for %04x\n",hwnd);
   if (!(lphl->dwStyle & LBS_MULTIPLESEL))
      {
        if( lphl->ItemsCount )
@@ -1780,7 +1780,7 @@
 
   if (!(lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )) return 0;
 
-  dprintf_listbox(stddeb,"LBSetCaretIndex: hwnd "NPFMT" n=%i\n",hwnd,wParam);  
+  dprintf_listbox(stddeb,"LBSetCaretIndex: hwnd %04x n=%i\n",hwnd,wParam);  
 
   if (wParam >= lphl->ItemsCount) return LB_ERR;
 
@@ -1946,9 +1946,9 @@
   WND* ptrWnd = WIN_FindWndPtr(hwnd);  
 
   if( ptrWnd )
-	if( /* !(ptrWnd->dwExStyle & WS_EX_NOPARENTNOTIFY) && */ 
-                 ptrWnd->hwndParent ) 
-		 return SendMessage(ptrWnd->hwndParent,message,wParam,lParam);
+      if( /* !(ptrWnd->dwExStyle & WS_EX_NOPARENTNOTIFY) && */ 
+          ptrWnd->parent ) 
+          return SendMessage(ptrWnd->parent->hwndSelf,message,wParam,lParam);
   return 0;
 }
 
@@ -2044,8 +2044,7 @@
     char buffer[20];
     INT i;
 
-    dprintf_listbox( stddeb, "DlgDirSelect: "NPFMT" '%s' %d\n",
-                     hDlg, lpStr, id );
+    dprintf_listbox( stddeb, "DlgDirSelect: %04x '%s' %d\n", hDlg, lpStr, id );
     if ((i = SendDlgItemMessage( hDlg, id, LB_GETCURSEL, 0, 0 )) == LB_ERR)
         return FALSE;
     SendDlgItemMessage( hDlg, id, LB_GETTEXT, i, MAKE_SEGPTR(buffer) );
@@ -2083,7 +2082,7 @@
     ((attrib & DDL_POSTMSGS) ? PostMessage( hwnd, msg, wparam, lparam ) \
                              : SendMessage( hwnd, msg, wparam, lparam ))
 
-    dprintf_listbox( stddeb, "DlgDirList: "NPFMT" '%s' %d %d %04x\n",
+    dprintf_listbox( stddeb, "DlgDirList: %04x '%s' %d %d %04x\n",
                      hDlg, filespec ? filespec : "NULL",
                      idLBox, idStatic, attrib );
 
diff --git a/controls/menu.c b/controls/menu.c
index 00c2129..0457c11 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -126,7 +126,7 @@
     }
     menu = (POPUPMENU*) USER_HEAP_LIN_ADDR(hMenu);
     menu->wFlags |= MF_SYSMENU | MF_POPUP;
-    dprintf_menu(stddeb,"CopySysMenu hMenu="NPFMT" !\n", hMenu);
+    dprintf_menu(stddeb,"CopySysMenu hMenu=%04x !\n", hMenu);
     return hMenu;
 }
 
@@ -252,7 +252,7 @@
     }
 #ifdef WINELIB32
     menuchar = SendMessage( hwndOwner, WM_MENUCHAR, 
-			    MAKEWPARAM(key,menu->wFlags), (LPARAM)hmenu );
+			    MAKEWPARAM(key,menu->wFlags), hmenu );
 #else
     menuchar = SendMessage( hwndOwner, WM_MENUCHAR, key,
 			    MAKELONG( menu->wFlags, hmenu ) );
@@ -413,8 +413,8 @@
 
     if ((lprect == NULL) || (lppop == NULL)) return;
     if (lppop->nItems == 0) return;
-    dprintf_menu(stddeb,"MENU_MenuBarCalcSize left=%ld top=%ld right=%ld bottom=%ld !\n", 
-		(LONG)lprect->left, (LONG)lprect->top, (LONG)lprect->right, (LONG)lprect->bottom);
+    dprintf_menu(stddeb,"MENU_MenuBarCalcSize left=%d top=%d right=%d bottom=%d\n", 
+                 lprect->left, lprect->top, lprect->right, lprect->bottom);
     items = (MENUITEM *)USER_HEAP_LIN_ADDR( lppop->hItems );
     lppop->Width  = lprect->right - lprect->left;
     lppop->Height = 0;
@@ -495,7 +495,7 @@
         dis.hwndItem   = hwnd;
         dis.hDC        = hdc;
         dis.rcItem     = lpitem->rect;
-        SendMessage( hwnd, WM_DRAWITEM, 0, MAKE_SEGPTR(&dis) );
+        SendMessage( hwnd, WM_DRAWITEM, 0, (LPARAM)MAKE_SEGPTR(&dis) );
         return;
     }
 
@@ -655,7 +655,7 @@
     
     lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( (HMENU)wndPtr->wIDmenu );
     if (lppop == NULL || lprect == NULL) return SYSMETRICS_CYMENU;
-    dprintf_menu(stddeb,"MENU_DrawMenuBar("NPFMT", %p, %p); !\n", 
+    dprintf_menu(stddeb,"MENU_DrawMenuBar(%04x, %p, %p); !\n", 
 		 hDC, lprect, lppop);
     if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
     lprect->bottom = lprect->top + lppop->Height;
@@ -794,7 +794,7 @@
 /* FIX: Lost Info */
     else SendMessage( hwndOwner, WM_MENUSELECT, 
 		      MAKEWPARAM( (DWORD)hmenu, lppop->wFlags | MF_MOUSESELECT),
-		      (LPARAM)hmenu );
+		      hmenu );
 #else
     else SendMessage( hwndOwner, WM_MENUSELECT, hmenu,
                       MAKELONG( lppop->wFlags | MF_MOUSESELECT, hmenu ) );
@@ -920,7 +920,7 @@
             strcpy( (char *)USER_HEAP_LIN_ADDR( hText ), str );
         }
     }
-    else if (flags & MF_BITMAP) item->hText = (HANDLE)(DWORD)data;
+    else if (flags & MF_BITMAP) item->hText = (HANDLE)data;
     else if (flags & MF_OWNERDRAW) SET_OWNERDRAW_DATA( item, data );
     else item->hText = 0;
 
@@ -945,7 +945,7 @@
 
     if (!(menu = (POPUPMENU *)USER_HEAP_LIN_ADDR(hMenu))) 
     {
-        dprintf_menu( stddeb, "MENU_InsertItem: "NPFMT" not a menu handle\n",
+        dprintf_menu( stddeb, "MENU_InsertItem: %04x not a menu handle\n",
                       hMenu );
         return NULL;
     }
@@ -969,7 +969,7 @@
         }
         if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu)))
         {
-            dprintf_menu(stddeb,"MENU_InsertItem: "NPFMT" not a menu handle\n",
+            dprintf_menu(stddeb,"MENU_InsertItem: %04x not a menu handle\n",
                          hMenu);
             return NULL;
         }
@@ -1670,7 +1670,7 @@
 	    CREATESTRUCT *createStruct = (CREATESTRUCT*)PTR_SEG_TO_LIN(lParam);
 #ifdef WINELIB32
 	    HMENU hmenu = (HMENU) (createStruct->lpCreateParams);
-	    SetWindowLong( hwnd, 0, (LONG)hmenu );
+	    SetWindowLong( hwnd, 0, hmenu );
 #else
 	    HMENU hmenu = (HMENU) ((int)createStruct->lpCreateParams & 0xffff);
 	    SetWindowWord( hwnd, 0, hmenu );
@@ -1731,8 +1731,8 @@
  */
 BOOL ChangeMenu( HMENU hMenu, UINT pos, SEGPTR data, UINT id, UINT flags )
 {
-    dprintf_menu( stddeb,"ChangeMenu: menu="NPFMT" pos=%d data=%08lx id=%04x flags=%04x\n",
-                  hMenu, pos, data, id, flags );
+    dprintf_menu( stddeb,"ChangeMenu: menu=%04x pos=%d data=%08lx id=%04x flags=%04x\n",
+                  hMenu, pos, (DWORD)data, id, flags );
     if (flags & MF_APPEND)
     {
         return AppendMenu( hMenu, flags & ~MF_APPEND, id, data );
@@ -1766,8 +1766,7 @@
     MENUITEM *item;
     INT ret;
 
-    dprintf_menu( stddeb,"CheckMenuItem: "NPFMT" %04x %04x\n", 
-                  hMenu, id, flags );
+    dprintf_menu( stddeb,"CheckMenuItem: %04x %04x %04x\n", hMenu, id, flags );
     if (!(item = MENU_FindItem( &hMenu, &id, flags ))) return -1;
     ret = item->item_flags & MF_CHECKED;
     if (flags & MF_CHECKED) item->item_flags |= MF_CHECKED;
@@ -1782,7 +1781,7 @@
 BOOL EnableMenuItem(HMENU hMenu, UINT wItemID, UINT wFlags)
 {
     LPMENUITEM 	lpitem;
-    dprintf_menu(stddeb,"EnableMenuItem ("NPFMT", %04X, %04X) !\n", 
+    dprintf_menu(stddeb,"EnableMenuItem (%04x, %04X, %04X) !\n", 
 		 hMenu, wItemID, wFlags);
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return FALSE;
 
@@ -1811,7 +1810,7 @@
 {
     LPMENUITEM lpitem;
 
-    dprintf_menu( stddeb, "GetMenuString: menu="NPFMT" item=%04x ptr=%p len=%d flags=%04x\n",
+    dprintf_menu( stddeb, "GetMenuString: menu=%04x item=%04x ptr=%p len=%d flags=%04x\n",
                  hMenu, wItemID, str, nMaxSiz, wFlags );
     if (!str || !nMaxSiz) return 0;
     str[0] = '\0';
@@ -1830,8 +1829,8 @@
 {
     LPPOPUPMENU menu;
     LPMENUITEM  lpitem;
-    dprintf_menu(stddeb,"HiliteMenuItem("NPFMT", "NPFMT", %04X, %04X);\n", 
-						hWnd, hMenu, wItemID, wHilite);
+    dprintf_menu(stddeb,"HiliteMenuItem(%04x, %04x, %04x, %04x);\n", 
+                 hWnd, hMenu, wItemID, wHilite);
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wHilite ))) return FALSE;
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
     if (menu->FocusedItem == wItemID) return TRUE;
@@ -1847,7 +1846,7 @@
 UINT GetMenuState(HMENU hMenu, UINT wItemID, UINT wFlags)
 {
     LPMENUITEM lpitem;
-    dprintf_menu(stddeb,"GetMenuState("NPFMT", %04X, %04X);\n", 
+    dprintf_menu(stddeb,"GetMenuState(%04x, %04x, %04x);\n", 
 		 hMenu, wItemID, wFlags);
     if (!(lpitem = MENU_FindItem( &hMenu, &wItemID, wFlags ))) return -1;
     if (lpitem->item_flags & MF_POPUP)
@@ -1866,10 +1865,10 @@
 INT GetMenuItemCount(HMENU hMenu)
 {
 	LPPOPUPMENU	menu;
-	dprintf_menu(stddeb,"GetMenuItemCount("NPFMT");\n", hMenu);
+	dprintf_menu(stddeb,"GetMenuItemCount(%04x);\n", hMenu);
 	menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
 	if (menu == NULL) return (UINT)-1;
-	dprintf_menu(stddeb,"GetMenuItemCount("NPFMT") return %d \n", 
+	dprintf_menu(stddeb,"GetMenuItemCount(%04x) return %d \n", 
 		     hMenu, menu->nItems);
 	return menu->nItems;
 }
@@ -1883,7 +1882,7 @@
     LPPOPUPMENU	menu;
     MENUITEM *item;
 
-    dprintf_menu(stddeb,"GetMenuItemID("NPFMT", %d);\n", hMenu, nPos);
+    dprintf_menu(stddeb,"GetMenuItemID(%04x, %d);\n", hMenu, nPos);
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return -1;
     if ((nPos < 0) || (nPos >= menu->nItems)) return -1;
     item = (MENUITEM *) USER_HEAP_LIN_ADDR( menu->hItems );
@@ -1900,9 +1899,9 @@
     MENUITEM *item;
 
     if (IS_STRING_ITEM(flags) && data)
-        dprintf_menu( stddeb, "InsertMenu: "NPFMT" %d %04x %04x '%s'\n",
+        dprintf_menu( stddeb, "InsertMenu: %04x %d %04x %04x '%s'\n",
                       hMenu, pos, flags, id, (char *)PTR_SEG_TO_LIN(data) );
-    else dprintf_menu( stddeb, "InsertMenu: "NPFMT" %d %04x %04x %08lx\n",
+    else dprintf_menu( stddeb, "InsertMenu: %04x %d %04x %04x %08lx\n",
                        hMenu, pos, flags, id, (DWORD)data );
 
     if (!(item = MENU_InsertItem( hMenu, pos, flags ))) return FALSE;
@@ -1938,7 +1937,7 @@
 {
     LPPOPUPMENU	menu;
     LPMENUITEM 	lpitem;
-	dprintf_menu(stddeb,"RemoveMenu ("NPFMT", %04X, %04X) !\n", 
+	dprintf_menu(stddeb,"RemoveMenu (%04x, %04x, %04x) !\n", 
 		     hMenu, nPos, wFlags);
     if (!(lpitem = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
     if (!(menu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
@@ -1990,13 +1989,13 @@
 
     if (IS_STRING_ITEM(flags))
     {
-	dprintf_menu( stddeb, "ModifyMenu: "NPFMT" %d %04x %04x '%s'\n",
+	dprintf_menu( stddeb, "ModifyMenu: %04x %d %04x %04x '%s'\n",
                       hMenu, pos, flags, id,
                       data ? (char *)PTR_SEG_TO_LIN(data) : "#NULL#");
         if (!data) return FALSE;
     }
     else
-	dprintf_menu( stddeb, "ModifyMenu: "NPFMT" %d %04x %04x %08lx\n",
+	dprintf_menu( stddeb, "ModifyMenu: %04x %d %04x %04x %08lx\n",
                       hMenu, pos, flags, id, (DWORD)data );
     if (!(item = MENU_FindItem( &hMenu, &pos, flags ))) return FALSE;
 
@@ -2032,11 +2031,11 @@
  *			SetMenuItemBitmaps	[USER.418]
  */
 BOOL SetMenuItemBitmaps(HMENU hMenu, UINT nPos, UINT wFlags,
-		HBITMAP hNewUnCheck, HBITMAP hNewCheck)
+                        HBITMAP hNewUnCheck, HBITMAP hNewCheck)
 {
     LPMENUITEM lpitem;
-   dprintf_menu(stddeb,"SetMenuItemBitmaps ("NPFMT", %04X, %04X, "NPFMT", %08lX) !\n",
-	    hMenu, nPos, wFlags, hNewCheck, (DWORD)hNewUnCheck);
+   dprintf_menu(stddeb,"SetMenuItemBitmaps(%04x, %04x, %04x, %04x, %04x)\n",
+                hMenu, nPos, wFlags, hNewCheck, hNewUnCheck);
     if (!(lpitem = MENU_FindItem( &hMenu, &nPos, wFlags ))) return FALSE;
 
     if (!hNewCheck && !hNewUnCheck)
@@ -2077,7 +2076,7 @@
     menu->hWnd   = 0;
     menu->hItems = 0;
     menu->FocusedItem = NO_SELECTED_ITEM;
-    dprintf_menu(stddeb,"CreateMenu // return "NPFMT"\n", hMenu);
+    dprintf_menu(stddeb,"CreateMenu // return %04x\n", hMenu);
     return hMenu;
 }
 
@@ -2088,7 +2087,7 @@
 BOOL DestroyMenu(HMENU hMenu)
 {
     LPPOPUPMENU lppop;
-    dprintf_menu(stddeb,"DestroyMenu ("NPFMT") !\n", hMenu);
+    dprintf_menu(stddeb,"DestroyMenu (%04x) !\n", hMenu);
     if (hMenu == 0) return FALSE;
     lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
     if (!lppop || (lppop->wMagic != MENU_MAGIC)) return FALSE;
@@ -2110,7 +2109,7 @@
         USER_HEAP_FREE( lppop->hItems );
     }
     USER_HEAP_FREE( hMenu );
-    dprintf_menu(stddeb,"DestroyMenu ("NPFMT") // End !\n", hMenu);
+    dprintf_menu(stddeb,"DestroyMenu (%04x) // End !\n", hMenu);
     return TRUE;
 }
 
@@ -2162,18 +2161,18 @@
 	LPPOPUPMENU lpmenu;
 	WND * wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr == NULL) {
-		fprintf(stderr,"SetMenu("NPFMT", "NPFMT") // Bad window handle !\n",
+		fprintf(stderr,"SetMenu(%04x, %04x) // Bad window handle !\n",
 			hWnd, hMenu);
 		return FALSE;
 		}
-	dprintf_menu(stddeb,"SetMenu("NPFMT", "NPFMT");\n", hWnd, hMenu);
+	dprintf_menu(stddeb,"SetMenu(%04x, %04x);\n", hWnd, hMenu);
 	if (GetCapture() == hWnd) ReleaseCapture();
 	wndPtr->wIDmenu = (UINT)hMenu;
 	if (hMenu != 0)
 	{
 	    lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
 	    if (lpmenu == NULL) {
-		fprintf(stderr,"SetMenu("NPFMT", "NPFMT") // Bad menu handle !\n", 
+		fprintf(stderr,"SetMenu(%04x, %04x) // Bad menu handle !\n", 
 			hWnd, hMenu);
 		return FALSE;
 		}
@@ -2195,7 +2194,7 @@
 {
     LPPOPUPMENU lppop;
     LPMENUITEM 	lpitem;
-    dprintf_menu(stddeb,"GetSubMenu ("NPFMT", %04X) !\n", hMenu, nPos);
+    dprintf_menu(stddeb,"GetSubMenu (%04x, %04X) !\n", hMenu, nPos);
     if (!(lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return 0;
     if ((UINT)nPos >= lppop->nItems) return 0;
     lpitem = (MENUITEM *) USER_HEAP_LIN_ADDR( lppop->hItems );
@@ -2211,7 +2210,7 @@
 {
 	WND		*wndPtr;
 	LPPOPUPMENU lppop;
-	dprintf_menu(stddeb,"DrawMenuBar ("NPFMT")\n", hWnd);
+	dprintf_menu(stddeb,"DrawMenuBar (%04x)\n", hWnd);
 	wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr != NULL && (wndPtr->dwStyle & WS_CHILD) == 0 && 
 		wndPtr->wIDmenu != 0) {
@@ -2259,11 +2258,11 @@
     if (HIWORD(name))
     {
         char *str = (char *)PTR_SEG_TO_LIN( name );
-        dprintf_menu( stddeb, "LoadMenu("NPFMT",'%s')\n", instance, str );
+        dprintf_menu( stddeb, "LoadMenu(%04x,'%s')\n", instance, str );
         if (str[0] == '#') name = (SEGPTR)atoi( str + 1 );
     }
     else
-        dprintf_resource(stddeb,"LoadMenu("NPFMT",%04x)\n",instance,LOWORD(name));
+        dprintf_resource(stddeb,"LoadMenu(%04x,%04x)\n",instance,LOWORD(name));
 
     if (!name) return 0;
 
diff --git a/controls/scroll.c b/controls/scroll.c
index 8f67f09..9824b3b 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -358,9 +358,8 @@
         if (nBar == SB_CTL)  /* Only scrollbar controls send WM_CTLCOLOR */
         {
 #ifdef WINELIB32
-            HBRUSH hbrush = (HBRUSH)SendMessage( GetParent(hwnd), 
-						 WM_CTLCOLORSCROLLBAR,
-						 (WPARAM)hdc, (LPARAM)hwnd );
+            HBRUSH hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLORSCROLLBAR,
+                                         hdc, hwnd );
 #else
             HBRUSH hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLOR, hdc,
                                          MAKELONG(hwnd, CTLCOLOR_SCROLLBAR) );
@@ -505,7 +504,7 @@
 static void SCROLL_HandleKbdEvent( HWND hwnd, WORD wParam )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
-    WORD msg;
+    WPARAM msg;
     
     switch(wParam)
     {
@@ -521,7 +520,7 @@
 #ifdef WINELIB32
     SendMessage( GetParent(hwnd),
                  (wndPtr->dwStyle & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
-                 (WPARAM)msg, (LPARAM)hwnd );
+                 msg, hwnd );
 #else
     SendMessage( GetParent(hwnd),
                  (wndPtr->dwStyle & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
@@ -598,8 +597,8 @@
           return;  /* Should never happen */
     }
 
-    dprintf_scroll( stddeb, "ScrollBar Event: hwnd="NPFMT" bar=%d msg=%x pt=%ld,%ld hit=%d\n",
-                    hwnd, nBar, msg, (LONG)pt.x, (LONG)pt.y, hittest );
+    dprintf_scroll( stddeb, "ScrollBar Event: hwnd=%04x bar=%d msg=%x pt=%d,%d hit=%d\n",
+                    hwnd, nBar, msg, pt.x, pt.y, hittest );
 
     switch(trackHitTest)
     {
@@ -615,7 +614,7 @@
             {
 #ifdef WINELIB32
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                             (WPARAM)SB_LINEUP, (LPARAM)hwndCtl );
+                             SB_LINEUP, hwndCtl );
 #else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_LINEUP, MAKELONG( 0, hwndCtl ));
@@ -638,7 +637,7 @@
             {
 #ifdef WINELIB32
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                             (WPARAM)SB_PAGEUP, (LPARAM)hwndCtl );
+                             SB_PAGEUP, hwndCtl );
 #else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_PAGEUP, MAKELONG( 0, hwndCtl ));
@@ -682,7 +681,7 @@
                 uTrackingPos = trackThumbPos + pos - lastClickPos;
 #ifdef WINELIB32
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                             MAKEWPARAM(SB_THUMBTRACK,val), (LPARAM)hwndCtl );
+                             MAKEWPARAM(SB_THUMBTRACK,val), hwndCtl );
 #else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_THUMBTRACK, MAKELONG( val, hwndCtl ));
@@ -703,7 +702,7 @@
             {
 #ifdef WINELIB32
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                             (WPARAM)SB_PAGEDOWN, (LPARAM)hwndCtl );
+                             SB_PAGEDOWN, hwndCtl );
 #else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_PAGEDOWN, MAKELONG( 0, hwndCtl ));
@@ -725,7 +724,7 @@
             {
 #ifdef WINELIB32
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                             (WPARAM)SB_LINEDOWN, (LPARAM)hwndCtl );
+                             SB_LINEDOWN, hwndCtl );
 #else
                 SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                              SB_LINEDOWN, MAKELONG( 0, hwndCtl ));
@@ -747,7 +746,7 @@
                                  trackThumbPos + lastMousePos - lastClickPos );
 #ifdef WINELIB32
             SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                         MAKEWPARAM(SB_THUMBPOSITION,val), (LPARAM)hwndCtl );
+                         MAKEWPARAM(SB_THUMBPOSITION,val), hwndCtl );
 #else
             SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                          SB_THUMBPOSITION, MAKELONG( val, hwndCtl ) );
@@ -756,7 +755,7 @@
         else
 #ifdef WINELIB32
             SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
-                         (WPARAM)SB_ENDSCROLL, (LPARAM)hwndCtl );
+                         SB_ENDSCROLL, hwndCtl );
 #else
             SendMessage( hwndOwner, vertical ? WM_VSCROLL : WM_HSCROLL,
                          SB_ENDSCROLL, MAKELONG( 0, hwndCtl ) );
@@ -812,7 +811,7 @@
             }
         }
         if (!hUpArrow) SCROLL_LoadBitmaps();
-        dprintf_scroll( stddeb, "ScrollBar creation, hwnd="NPFMT"\n", hwnd );
+        dprintf_scroll( stddeb, "ScrollBar creation, hwnd=%04x\n", hwnd );
         return 0;
 	
     case WM_LBUTTONDOWN:
@@ -898,7 +897,7 @@
 
     if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return;
 
-    dprintf_scroll( stddeb,"SetScrollRange hwnd="NPFMT" bar=%d min=%d max=%d\n",
+    dprintf_scroll( stddeb,"SetScrollRange hwnd=%04x bar=%d min=%d max=%d\n",
                     hwnd, nBar, MinVal, MaxVal );
 
       /* Invalid range -> range is set to (0,0) */
@@ -936,7 +935,7 @@
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if (!wndPtr) return;
-    dprintf_scroll( stddeb, "ShowScrollBar: hwnd="NPFMT" bar=%d on=%d\n", hwnd, wBar, fShow );
+    dprintf_scroll( stddeb, "ShowScrollBar: hwnd=%04x bar=%d on=%d\n", hwnd, wBar, fShow );
 
     switch(wBar)
     {
@@ -1002,7 +1001,7 @@
     HDC hdc;
 
     if (!(infoPtr = SCROLL_GetScrollInfo( hwnd, nBar ))) return FALSE;
-    dprintf_scroll( stddeb, "EnableScrollBar: "NPFMT" %d %d\n", hwnd, nBar, flags );
+    dprintf_scroll( stddeb, "EnableScrollBar: %04x %d %d\n", hwnd, nBar, flags );
     flags &= ESB_DISABLE_BOTH;
     if (infoPtr->flags == flags) return FALSE;
     infoPtr->flags = flags;
diff --git a/controls/static.c b/controls/static.c
index 11adb0d..eb51961 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -91,9 +91,9 @@
 		if (createStruct->lpszName)
                 {
                     HICON hicon = LoadIcon( createStruct->hInstance,
-                                            (SEGPTR)createStruct->lpszName );
+                                            createStruct->lpszName );
                     if (!hicon)  /* Try OEM icon (FIXME: is this right?) */
-                        hicon = LoadIcon( 0, (SEGPTR)createStruct->lpszName );
+                        hicon = LoadIcon( 0, createStruct->lpszName );
                     STATIC_SetIcon( hWnd, hicon );
                 }
                 return 1;
@@ -159,7 +159,7 @@
             break;
 
         case WM_GETFONT:
-            return (LONG)infoPtr->hFont;
+            return infoPtr->hFont;
 
 	case WM_NCHITTEST:
 	    return HTTRANSPARENT;
@@ -168,10 +168,10 @@
             return DLGC_STATIC;
 
 	case STM_GETICON:
-	    return (LONG)infoPtr->hIcon;
+	    return infoPtr->hIcon;
 
 	case STM_SETICON:
-            lResult = (LONG)STATIC_SetIcon( hWnd, (HICON)wParam );
+            lResult = STATIC_SetIcon( hWnd, (HICON)wParam );
             InvalidateRect( hWnd, NULL, FALSE );
             UpdateWindow( hWnd );
 	    break;
@@ -230,16 +230,14 @@
 
     if (infoPtr->hFont) SelectObject( hdc, infoPtr->hFont );
 #ifdef WINELIB32
-    hBrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC,
-				  (WPARAM)hdc, (LPARAM)hwnd );
+    hBrush = SendMessage( GetParent(hwnd), WM_CTLCOLORSTATIC, hdc, hwnd );
 #else
-    hBrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, (WORD)hdc,
+    hBrush = SendMessage( GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc,
                           MAKELONG(hwnd, CTLCOLOR_STATIC));
 #endif
-    if (hBrush == (HBRUSH)NULL) hBrush = GetStockObject(WHITE_BRUSH);
+    if (!hBrush) hBrush = GetStockObject(WHITE_BRUSH);
     FillRect(hdc, &rc, hBrush);
-    if (text)
-	DrawText(hdc, text, -1, &rc, wFormat);
+    if (text) DrawText( hdc, text, -1, &rc, wFormat );
 }
 
 static void PaintRectfn( HWND hwnd, HDC hdc )
@@ -293,10 +291,9 @@
 
     GetClientRect(hwnd, &rc);
 #ifdef WINELIB32
-    hbrush = (HBRUSH)SendMessage( wndPtr->hwndParent, WM_CTLCOLORSTATIC, 
-				  (WPARAM)hdc, (LPARAM)hwnd );
+    hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLORSTATIC, hdc, hwnd );
 #else
-    hbrush = SendMessage( wndPtr->hwndParent, WM_CTLCOLOR, hdc,
+    hbrush = SendMessage( GetParent(hwnd), WM_CTLCOLOR, hdc,
                           MAKELONG(hwnd, CTLCOLOR_STATIC));
 #endif
     FillRect( hdc, &rc, hbrush );
diff --git a/documentation/winsock b/documentation/winsock
new file mode 100644
index 0000000..d8c497e
--- /dev/null
+++ b/documentation/winsock
@@ -0,0 +1,65 @@
+Winsock
+
+Platform 1.
+Windows NT 3.51, build 1057, Service Pack 2
+
+Platform 2.
+Windows 3.1 with Trumpet Sockets (2.1f)
+
+Testing
+-------
+  Testing was done using the Windows Sockets API Tester (WSAT), available
+from rhino.microsoft.com/wsat/wsat594.exe. I found a number of tests that
+would not run under Wine, some that failed under Trumpet, and others under
+NT. So, I decided to use tests that at least succeeded IN FULL on all the
+test platforms.
+
+These are only the local tests.
+
+Any program which makes use of the WSAAsync* calls, pretty much won't
+work. Other program which work correctly will work ... mostly. Programs
+which are incorrect, will probably crash and burn fairly quickly.
+
+I have tried to make WINESockets as close as possible to Trumpet's.
+
+The numbers in brackets next to each platform indicate how many tests failed,
+the numbers listed on the variations line are the test that failed.
+
+Investigated
+============
+
+BINDT.TST	NT (00)    Trumpet (10)    Wine (10)
+BINDU.TST	NT (00)    Trumpet (10)    Wine (10)
+HOST.TST	NT (01)    Trumpet (06)    Wine (38)*3
+HOSTHOST.TST	NT (01)*1  Trumpet (01)*1  Wine (00) 
+HOSTNAME.TST	NT (01)    Trumpet (00)    Wine (00)*2
+INET.TST	NT (01)    Trumpet (24)*1  Wine (01)
+IOCTLT.TST	NT (00)    Trumpet (00)    Wine (06)
+IOCTLU.TST	NT (00)    Trumpet (00)    Wine (04)
+PROTO.TST	NT (00)    Trumpet (00)    Wine (41)*3
+SERV.TST	NT (00)    Trumpet (00)    Wine (50)*3
+SOCKETT.TST	NT (01)    Trumpet (00)    Wine (00)
+SOCKETU.TST	NT (03)    Trumpet (00)    Wine (00)
+START.TST	NT (00)    Trumpet (00)    Wine (08)*3
+STARTL.TST	NT (00)*4  Trumpet (00)    Wine (00)
+
+STARTH.TST	Wine crashed with two messages (from the program, methinks)
+		indicating "FREE - HEAPBADNODE - bad node in head."
+
+Unchecked
+=========
+ENOBUFST.TST	ENOBUFSU.TST
+GETOPTT.TST	GETOPTU.TST
+SETOPTT.TST	SETOPTU.TST
+All the client/server tests
+
+*1 errors in the NT and/or Trumpet were caused
+   by a mistake I made while configuring this test.
+
+*2 Wine passes these tests, because they aren't done
+   correctly not because it does everything correctly.
+
+*3 Wine crashed part way through the testing process,
+   hence the large value of tests failed.
+
+*4 NT actually supports Winsock 1.0 as well.
diff --git a/files/file.c b/files/file.c
index a16f929..758aa64 100644
--- a/files/file.c
+++ b/files/file.c
@@ -1048,8 +1048,8 @@
         {
             memcpy( pdb->fileHandles, files, 20 );
 #ifdef WINELIB
-            GlobalFree( pdb->fileHandlesPtr );
-            pdb->fileHandlesPtr = pdb->fileHandles;
+            GlobalFree( (HGLOBAL)pdb->fileHandlesPtr );
+            pdb->fileHandlesPtr = (SEGPTR)pdb->fileHandles;
 #else
             GlobalFree( GlobalHandle( SELECTOROF(pdb->fileHandlesPtr) ));
             pdb->fileHandlesPtr = (SEGPTR)MAKELONG( 0x18,
@@ -1075,7 +1075,7 @@
         }
         else memcpy( newfiles, files, count );
 #ifdef WINELIB
-        if (pdb->nbFiles > 20) GlobalFree( pdb->fileHandlesPtr );
+        if (pdb->nbFiles > 20) GlobalFree( (HGLOBAL)pdb->fileHandlesPtr );
 #else
         if (pdb->nbFiles > 20)
             GlobalFree( GlobalHandle( SELECTOROF(pdb->fileHandlesPtr) ));
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index 5b6d3c0..299f833 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -203,7 +203,7 @@
 0199 stub GetMetaFileW
 0200 stub GetMetaRgn
 0201 stub GetMiterLimit
-0202 stub GetNearestColor
+0202 stdcall GetNearestColor(long long) GetNearestColor
 0203 stub GetNearestPaletteIndex
 0204 stdcall GetObjectA(long long ptr) WIN32_GetObject
 0205 stub GetObjectType
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 20f485a..3388430 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -71,7 +71,7 @@
 0067 stub DefineDosDeviceA
 0068 stub DefineDosDeviceW
 0069 stub DeleteAtom
-0070 stub DeleteCriticalSection
+0070 stdcall DeleteCriticalSection(ptr)	DeleteCriticalSection
 0071 stub DeleteFileA
 0072 stub DeleteFileW
 0073 stub DeviceIoControl
@@ -82,7 +82,7 @@
 0078 	stdcall DuplicateHandle(long long long ptr long long long) DuplicateHandle
 0079 stub EndUpdateResourceA
 0080 stub EndUpdateResourceW
-0081 stub EnterCriticalSection
+0081 stdcall EnterCriticalSection(ptr)	EnterCriticalSection
 0082 stub EnumCalendarInfoA
 0083 stub EnumCalendarInfoW
 0084 stub EnumDateFormatsA
@@ -142,8 +142,8 @@
 0138 stub FormatMessageA
 0139 stub FormatMessageW
 0140 stub FreeConsole
-0141 stub FreeEnvironmentStringsA
-0142 stub FreeEnvironmentStringsW
+0141 stdcall FreeEnvironmentStringsA(ptr)	FreeEnvironmentStringsA
+0142 stdcall FreeEnvironmentStringsW(ptr)	FreeEnvironmentStringsW
 0143 stub FreeLibrary
 0144 stub FreeLibraryAndExitThread
 0145 stdcall FreeResource(long) FreeResource32
@@ -213,12 +213,12 @@
 0209 stub GetDriveTypeW
 0210	stdcall GetEnvironmentStrings()	GetEnvironmentStrings
 0211 stub GetEnvironmentStringsA
-0212 stub GetEnvironmentStringsW
+0212 	stdcall GetEnvironmentStringsW()		GetEnvironmentStringsW
 0213    stdcall GetEnvironmentVariableA(ptr ptr long) GetEnvironmentVariableA
 0214 stub GetEnvironmentVariableW
 0215 stub GetExitCodeProcess
 0216 stub GetExitCodeThread
-0217 stub GetFileAttributesA
+0217 stdcall GetFileAttributesA(ptr)		GetFileAttributesA
 0218 stub GetFileAttributesW
 0219   stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
 0220 stub GetFileSize
@@ -315,7 +315,7 @@
 0310 stub GetVolumeInformationW
 0311 stub GetWindowsDirectoryA
 0312 stub GetWindowsDirectoryW
-0313 stub GlobalAddAtomA
+0313 stdcall GlobalAddAtomA(long) WIN32_GlobalAddAtomA
 0314 stub GlobalAddAtomW
 0315	stdcall GlobalAlloc(long long)	GlobalAlloc32
 0316 stub GlobalCompact
@@ -348,7 +348,7 @@
 0343 stub HeapValidate
 0344 stub HeapWalk
 0345 stub InitAtomTable
-0346 stub InitializeCriticalSection
+0346 stdcall InitializeCriticalSection(ptr)	InitializeCriticalSection
 0347 stub InterlockedDecrement
 0348 stub InterlockedExchange
 0349 stub InterlockedIncrement
@@ -366,7 +366,7 @@
 0361 stub IsValidLocale
 0362 stub LCMapStringA
 0363 stub LCMapStringW
-0364 stub LeaveCriticalSection
+0364 stdcall LeaveCriticalSection(ptr)	LeaveCriticalSection
 0365	stdcall LoadLibraryA(long)		LoadLibraryA
 0366 stub LoadLibraryExA
 0367 stub LoadLibraryExW
@@ -532,10 +532,10 @@
 0527 stub SystemTimeToTzSpecificLocalTime
 0528 stub TerminateProcess
 0529 stub TerminateThread
-0530 stub TlsAlloc
-0531 stub TlsFree
-0532 stub TlsGetValue
-0533 stub TlsSetValue
+0530 stdcall TlsAlloc()	TlsAlloc
+0531 stdcall TlsFree(long)	TlsFree
+0532 stdcall TlsGetValue(long)	TlsGetValue
+0533 stdcall TlsSetValue(long ptr)	TlsSetValue
 0534 stub TransactNamedPipe
 0535 stub TransmitCommChar
 0536 stub TrimVirtualBuffer
@@ -567,7 +567,7 @@
 0562 stub WaitForSingleObjectEx
 0563 stub WaitNamedPipeA
 0564 stub WaitNamedPipeW
-0565 stub WideCharToMultiByte
+0565 stdcall WideCharToMultiByte(long long ptr long ptr long ptr ptr)	WideCharToMultiByte
 0566 stub WinExec
 0567 stub WriteConsoleA
 0568 stub WriteConsoleInputA
diff --git a/if1632/user32.spec b/if1632/user32.spec
index 763352f..9934c77 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -366,13 +366,12 @@
 0355 stdcall LoadAcceleratorsW(long ptr)	WIN32_LoadAcceleratorsW
 0356 	stdcall LoadBitmapA(long ptr) WIN32_LoadBitmapA
 0357 	stdcall LoadBitmapW(long ptr) WIN32_LoadBitmapW
-0357 stub LoadBitmapW
-0358 	stdcall LoadCursorA(long ptr) LoadCursor
+0358 	stdcall LoadCursorA(long ptr) WIN32_LoadCursorA
 0359 stub LoadCursorFromFileA
 0360 stub LoadCursorFromFileW
-0361 stub LoadCursorW
-0362 	stdcall LoadIconA(long ptr) LoadIconA32
-0363 stdcall LoadIconW(long ptr) LoadIconW32
+0361	stdcall LoadCursorW(long ptr) WIN32_LoadCursorW
+0362	stdcall LoadIconA(long ptr) WIN32_LoadIconA
+0363 	stdcall LoadIconW(long ptr) WIN32_LoadIconW
 0364 stub LoadImageA
 0365 stub LoadImageW
 0366 stub LoadKeyboardLayoutA
diff --git a/include/callback.h b/include/callback.h
index 4f8b6dd..2a33b6f 100644
--- a/include/callback.h
+++ b/include/callback.h
@@ -81,7 +81,7 @@
 #define CallEnumObjectsProc( func, lpobj, lParam ) \
     (*func)( lpobj, lParam )
 #define CallEnumPropProc( func, hwnd, lpstr, data ) \
-    (*func)( hwnd, lpstr, data )
+    (*func)( hwnd, (LPCTSTR)(lpstr), data )
 #define CallEnumTaskWndProc( func, hwnd, lParam ) \
     (*func)( hwnd, lParam )
 #define CallEnumWindowsProc( func, hwnd, lParam ) \
diff --git a/include/kernel32.h b/include/kernel32.h
index 53e28b6..1b0febc 100644
--- a/include/kernel32.h
+++ b/include/kernel32.h
@@ -133,4 +133,14 @@
 #define FILE_ATTRIBUTE_ATOMIC_WRITE     0x0200
 #define FILE_ATTRIBUTE_XACTION_WRITE    0x0400
 
+/* Could this type be considered opaque? */
+typedef struct {
+	LPVOID	DebugInfo;
+	LONG LockCount;
+	LONG RecursionCount;
+	HANDLE OwningThread;
+	HANDLE LockSemaphore;
+	DWORD Reserved;
+}CRITICAL_SECTION;
+
 #endif  /* __WINE_KERNEL32_H */
diff --git a/include/struct32.h b/include/struct32.h
index 1e1de48..ff53d24 100644
--- a/include/struct32.h
+++ b/include/struct32.h
@@ -3,6 +3,10 @@
 #define _STRUCT32_H
 #include "handle32.h"
 
+#ifndef WINELIB
+#pragma pack(1)
+#endif
+
 typedef struct tagRECT32
 {
 	LONG left;
@@ -45,21 +49,21 @@
 typedef struct {
 	DWORD style;
 	DWORD dwExtendedStyle;
-	WORD noOfItems;
-	short x;
-	short y;
-	WORD cx;
-	WORD cy;
+	WORD noOfItems WINE_PACKED;
+	short x WINE_PACKED;
+	short y WINE_PACKED;
+	WORD cx WINE_PACKED;
+	WORD cy WINE_PACKED;
 } DLGTEMPLATE32;
 
 typedef struct {
 	DWORD style;
 	DWORD dwExtendedStyle;
-	short x;
-	short y;
-	short cx;
-	short cy;
-	WORD id;
+	short x WINE_PACKED;
+	short y WINE_PACKED;
+	short cx WINE_PACKED;
+	short cy WINE_PACKED;
+	WORD id WINE_PACKED;
 } DLGITEMTEMPLATE32;
 
 #define CW_USEDEFAULT32	0x80000000
@@ -132,4 +136,45 @@
 void STRUCT32_CREATESTRUCT32to16(const CREATESTRUCT32*,CREATESTRUCT*);
 void STRUCT32_CREATESTRUCT16to32(const CREATESTRUCT*,CREATESTRUCT32*);
 
+typedef struct {
+	BYTE   bWidth;
+	BYTE   bHeight;
+	BYTE   bColorCount;
+	BYTE   bReserved;
+	WORD   wPlanes;
+	WORD   wBitCount;
+	DWORD  dwBytesInRes;
+	WORD   wResId WINE_PACKED;
+	/*WORD   padding;	Spec is wrong, no padding here*/
+} ICONDIRENTRY32;
+
+typedef struct {
+	WORD   wWidth;
+	WORD   wHeight;
+	WORD   wPlanes;
+	WORD   wBitCount;
+	DWORD  dwBytesInRes;
+	WORD   wResId WINE_PACKED;
+	/*WORD   padding;*/
+} CURSORDIRENTRY32;
+
+typedef union{
+	ICONDIRENTRY32	icon;
+	CURSORDIRENTRY32	cursor;
+} CURSORICONDIRENTRY32;
+
+typedef struct {
+	WORD    idReserved;
+	WORD    idType;
+	WORD    idCount;
+	/*WORD	padding;*/
+	CURSORICONDIRENTRY32	idEntries[1];
+} CURSORICONDIR32;
+
+
+
+#ifndef WINELIB
+#pragma pack(4)
+#endif
+
 #endif
diff --git a/include/user.h b/include/user.h
index dc5c68a..5e18d8f 100644
--- a/include/user.h
+++ b/include/user.h
@@ -20,7 +20,8 @@
 #define USER_HEAP_LIN_ADDR(handle) LocalLock (handle)
 #define USER_HEAP_SEG_ADDR(handle) LocalLock (handle)
 #define USER_HEAP_FREE(handle) LocalFree (handle)
-#else
+
+#else  /* WINELIB */
 
 extern LPSTR USER_Heap;
 extern WORD USER_HeapSel;
diff --git a/include/win.h b/include/win.h
index f3b49b1..43b3fa6 100644
--- a/include/win.h
+++ b/include/win.h
@@ -29,11 +29,12 @@
 
 typedef struct tagWND
 {
-    HWND         hwndNext;       /* Next sibling */
-    HWND         hwndChild;      /* First child */
+    struct tagWND *next;         /* Next sibling */
+    struct tagWND *child;        /* First child */
+    struct tagWND *parent;       /* Window parent (from CreateWindow) */
+    struct tagWND *owner;        /* Window owner */
     DWORD        dwMagic;        /* Magic number (must be WND_MAGIC) */
-    HWND         hwndParent;     /* Window parent (from CreateWindow) */
-    HWND         hwndOwner;      /* Window owner */
+    HWND         hwndSelf;       /* Handle of this window */
     HCLASS       hClass;         /* Window class */
     HANDLE       hInstance;      /* Window hInstance (from CreateWindow) */
     RECT         rectClient;     /* Client area rel. to parent client area */
@@ -75,6 +76,7 @@
 
   /* Window functions */
 extern WND *WIN_FindWndPtr( HWND hwnd );
+extern WND *WIN_GetDesktop(void);
 extern void WIN_DumpWindow( HWND hwnd );
 extern void WIN_WalkWindows( HWND hwnd, int indent );
 extern Window WIN_GetXWindow( HWND hwnd );
diff --git a/include/windows.h b/include/windows.h
index 53be8c8..fa91818 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -9,10 +9,7 @@
 #pragma pack(1)
 #endif
 
-#ifdef WINELIB32
-typedef struct { SHORT x,y; } POINTS;
-#define MAKEPOINTS(l) (*((POINTS *)&(l)))
-#else
+#ifndef WINELIB32
 #define MAKEPOINT(l) (*((POINT *)&(l)))
 #endif
 typedef struct { INT cx,cy; } SIZE, *LPSIZE;
@@ -541,11 +538,7 @@
 { 
     WORD       lbStyle; 
     COLORREF   lbColor WINE_PACKED;
-#ifdef WINELIB32
-    LONG       lbHatch; 
-#else
-    INT      lbHatch; 
-#endif
+    INT        lbHatch; 
 } LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
 
   /* Brush styles */
@@ -2801,7 +2794,7 @@
 BOOL       ExtTextOut(HDC,short,short,WORD,LPRECT,LPSTR,WORD,LPINT);
 HICON      ExtractIcon(HINSTANCE,LPCSTR,UINT);
 WORD       FarGetOwner(HANDLE);
-void       FarSetOwner(HANDLE,WORD);
+void       FarSetOwner(HANDLE,HANDLE);
 void       FatalAppExit(UINT,LPCSTR);
 void       FatalExit(int);
 int        FillRect(HDC,LPRECT,HBRUSH);
diff --git a/include/winnls.h b/include/winnls.h
index 003ad2f..6791fd3 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -106,4 +106,13 @@
 #define NORM_IGNORESYMBOLS			4
 #define NORM_STRINGSORT				0x1000
 
+#define CP_ACP						0
+#define CP_OEMCP					1
+
+#define WC_DEFAULTCHECK				0x00000100
+#define WC_COMPOSITECHECK			0x00000200
+#define WC_DISCARDNS				0x00000010
+#define WC_SEPCHARS					0x00000020
+#define WC_DEFAULTCHAR				0x00000040
+
 #endif  /* __WINE_WINNLS_H */
diff --git a/include/winpos.h b/include/winpos.h
index 33ee4bb..455cce8 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -4,8 +4,10 @@
  * Copyright 1994 Alexandre Julliard
  */
 
-#ifndef WINPOS_H
-#define WINPOS_H
+#ifndef __WINE_WINPOS_H
+#define __WINE_WINPOS_H
+
+#include "win.h"
 
 #define DWP_MAGIC  0x5057  /* 'WP' */
 
@@ -34,6 +36,6 @@
 				   RECT *oldClientRect, WINDOWPOS *winpos,
 				   RECT *newClientRect );
 extern LONG WINPOS_HandleWindowPosChanging( WINDOWPOS *winpos );
-extern INT WINPOS_WindowFromPoint( POINT pt, HWND *phwnd );
+extern INT WINPOS_WindowFromPoint( POINT pt, WND **ppWnd );
 
-#endif  /* WINPOS_H */
+#endif  /* __WINE_WINPOS_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index 01df224..52e0548 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -31,31 +31,19 @@
 #ifdef WINELIB32
 typedef int INT;
 typedef unsigned int UINT;
-typedef short SHORT;
-typedef LONG WPARAM;
-typedef void* HANDLE;
+typedef char TCHAR;  /* Should probably eventually be unsigned short */
 typedef void* NPVOID;
 typedef void* SEGPTR;
-#define UIFMT "%u"
-#define NPFMT "%p"
-#define SPFMT "%p"
-
-/* Should probably eventually be unsigned short, but not now */
-typedef char TCHAR;
-#else
+#else  /* WINELIB32 */
 typedef short INT;
 typedef unsigned short UINT;
-typedef UINT WPARAM;
-typedef WORD HANDLE;
+typedef char TCHAR;  /* TCHAR is just char in Win16 */
 typedef WORD NPVOID;
 typedef DWORD SEGPTR;
-#define UIFMT "%hu"
-#define NPFMT "%04x"
-#define SPFMT "%08lx"
+#endif  /* WINELIB32 */
 
-/* TCHAR is just char in Win16 */
-typedef char TCHAR;
-#endif
+typedef UINT HANDLE;
+typedef UINT WPARAM;
 typedef LONG LPARAM;
 typedef LONG LRESULT;
 typedef INT HFILE;
diff --git a/ipc/dde_proc.c b/ipc/dde_proc.c
index c72f371..660dfd6 100644
--- a/ipc/dde_proc.c
+++ b/ipc/dde_proc.c
@@ -386,8 +386,7 @@
   struct msg_dat msg_dat;
   BOOL was_sent;		   /* sent/received */
   BOOL passed;
-  HWND hwnd;
-  WND	*window;
+  WND *wndPtr;
 
   if (curr_proc_idx==-1)	   /* do we have DDE initialized ? */
      return 0;
@@ -476,16 +475,17 @@
   }
 
   /* iterate through all the windows */
-  for (hwnd = GetTopWindow(GetDesktopWindow());
-       hwnd && (window = WIN_FindWndPtr(hwnd))!=NULL ;
-       hwnd = window->hwndNext) {
-     if (window->dwStyle & WS_POPUP || window->dwStyle & WS_CAPTION) {
+  for (wndPtr = WIN_FindWndPtr(GetTopWindow(GetDesktopWindow()));
+       wndPtr != NULL;
+       wndPtr = wndPtr->next)
+  {
+     if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION) {
 	if (was_sent)
-	   SendMessage( hwnd, remote_message->message,
+	   SendMessage( wndPtr->hwndSelf, remote_message->message,
 			remote_message->wParam, remote_message->lParam );
 	else
-	   PostMessage( hwnd, remote_message->message,
-		     remote_message->wParam, remote_message->lParam );
+	   PostMessage( wndPtr->hwndSelf, remote_message->message,
+                        remote_message->wParam, remote_message->lParam );
      } /* if */
   } /* for */
 
diff --git a/ipc/wine_test_stub.c b/ipc/wine_test_stub.c
index dd9499c..76cc952 100644
--- a/ipc/wine_test_stub.c
+++ b/ipc/wine_test_stub.c
@@ -97,7 +97,7 @@
   printf("WIN_FindWndPtr(%d)\n",hwnd);
   if (hwnd==0)
      return NULL;
-  win.hwndNext=0;
+  win.next=NULL;
   win.dwStyle=WS_POPUP;
   
   return &win;
diff --git a/library/heap.c b/library/heap.c
index c27389b..d942902 100644
--- a/library/heap.c
+++ b/library/heap.c
@@ -222,7 +222,7 @@
 	if (flags & LMEM_ZEROINIT) memset( m, 0, bytes );
     }
     m->Size=bytes-sizeof(HeapData);
-    return m+1;
+    return (HANDLE)(m+1);
 }
 
 HANDLE HEAP_Free (HANDLE hMem)
@@ -253,7 +253,7 @@
   if(flags & LMEM_ZEROINIT && bytes > m->Size)
     memset( (char*)m+sizeof(HeapData)+m->Size, 0, bytes-m->Size );
   m->Size=bytes;
-  return m+1;
+  return (HANDLE)(m+1);
 }
 
 HANDLE LocalAlloc (WORD flags, WORD bytes)
@@ -278,7 +278,7 @@
 
 LPVOID LocalLock (HANDLE hMem)
 {
-  return hMem;
+  return (LPVOID)hMem;
 }
 
 HANDLE LocalReAlloc (HANDLE hMem, WORD new_size, WORD flags)
@@ -311,7 +311,7 @@
 
 LPVOID GlobalLock (HGLOBAL hMem)
 {
-  return hMem;
+  return (LPVOID)hMem;
 }
 
 BOOL GlobalUnlock (HANDLE hMem)
diff --git a/library/libres.c b/library/libres.c
index 15a3434..f3c4e5a 100644
--- a/library/libres.c
+++ b/library/libres.c
@@ -92,7 +92,7 @@
  */
 LPVOID LIBRES_LockResource( HGLOBAL handle )
 {
-  return handle;
+  return (LPVOID)handle;
 }
 
 
diff --git a/library/miscstubs.c b/library/miscstubs.c
index 1354de1..b06c6a6 100644
--- a/library/miscstubs.c
+++ b/library/miscstubs.c
@@ -64,7 +64,7 @@
 WORD LOCAL_Size( WORD ds, HLOCAL handle )
   { return LocalSize(handle); }
 
-void FarSetOwner(HANDLE a, WORD b)
+void FarSetOwner(HANDLE a, HANDLE b)
 {
   WINELIB_UNIMP("FarSetOwner()");
 }
diff --git a/library/winmain.c b/library/winmain.c
index b94554e..d1c0ac0 100644
--- a/library/winmain.c
+++ b/library/winmain.c
@@ -3,6 +3,7 @@
 #include <malloc.h>
 #include "windows.h"
 #include "wine.h"
+#include "xmalloc.h"
 
 extern int MAIN_Init(void);
 extern BOOL WIDGETS_Init(void);
@@ -15,6 +16,16 @@
 int _WinMain (int argc, char *argv [])
 {
   HINSTANCE hInstance;
+  LPSTR lpszCmdParam;
+  int i, len = 0;
+
+  /* Alloc szCmdParam */
+  for (i = 1; i < argc; i++) len += strlen(argv[i]) + 1;
+  lpszCmdParam = (LPSTR) xmalloc(len + 1);
+  /* Concatenate arguments */
+  if (argc > 1) strcpy(lpszCmdParam, argv[1]);
+  else lpszCmdParam[0] = '\0';
+  for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]);
 
   if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */
   hInstance = WinExec( *argv, SW_SHOWNORMAL );
@@ -29,7 +40,7 @@
 #else
   return WinMain (hInstance,    /* hInstance */
 		  0,	        /* hPrevInstance */
-		  "",	        /* lpszCmdParam */
+		  lpszCmdParam, /* lpszCmdParam */
 		  SW_NORMAL);   /* nCmdShow */
 #endif
 }
diff --git a/loader/module.c b/loader/module.c
index a18f1da..7cece76 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -134,7 +134,7 @@
 
       /* Dump the module info */
 
-    printf( "Module "NPFMT":\n", hmodule );
+    printf( "Module %04x:\n", hmodule );
     printf( "count=%d flags=%04x heap=%d stack=%d\n",
             pModule->count, pModule->flags,
             pModule->heap_size, pModule->stack_size );
@@ -154,7 +154,7 @@
     printf( "\nSegment table:\n" );
     pSeg = NE_SEG_TABLE( pModule );
     for (i = 0; i < pModule->seg_count; i++, pSeg++)
-        printf( "%02x: pos=%d size=%d flags=%04x minsize=%d sel="NPFMT"\n",
+        printf( "%02x: pos=%d size=%d flags=%04x minsize=%d sel=%04x\n",
                 i + 1, pSeg->filepos, pSeg->size, pSeg->flags,
                 pSeg->minsize, pSeg->selector );
 
@@ -264,7 +264,7 @@
     static int cachedfd = -1;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_module( stddeb, "MODULE_OpenFile("NPFMT") cache: mod="NPFMT" fd=%d\n",
+    dprintf_module( stddeb, "MODULE_OpenFile(%04x) cache: mod=%04x fd=%d\n",
                     hModule, hCachedModule, cachedfd );
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return -1;
     if (hCachedModule == hModule) return cachedfd;
@@ -273,7 +273,7 @@
     name = NE_MODULE_NAME( pModule );
     if (!(unixName = DOSFS_GetUnixFileName( name, TRUE )) ||
         (cachedfd = open( unixName, O_RDONLY )) == -1)
-        fprintf( stderr, "MODULE_OpenFile: can't open file '%s' for module "NPFMT"\n",
+        fprintf( stderr, "MODULE_OpenFile: can't open file '%s' for module %04x\n",
                  name, hModule );
     dprintf_module( stddeb, "MODULE_OpenFile: opened '%s' -> %d\n",
                     name, cachedfd );
@@ -461,7 +461,7 @@
 
     hModule = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
     if (!hModule) return (HMODULE)11;  /* invalid exe */
-    FarSetOwner( hModule, (WORD)(DWORD)hModule );
+    FarSetOwner( hModule, hModule );
     pModule = (NE_MODULE *)GlobalLock( hModule );
     memcpy( pModule, &ne_header, sizeof(NE_MODULE) );
     pModule->count = 0;
@@ -609,7 +609,7 @@
 
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0;
 
-    dprintf_module( stddeb, "MODULE_GetOrdinal("NPFMT",'%s')\n",
+    dprintf_module( stddeb, "MODULE_GetOrdinal(%04x,'%s')\n",
                     hModule, name );
 
       /* First handle names of the form '#xxxx' */
@@ -1162,11 +1162,7 @@
  */
 HMODULE WIN16_GetModuleHandle( SEGPTR name )
 {
-#ifdef WINELIB32
-    if (HIWORD(name) == 0) return GetExePtr( name );
-#else
-    if (HIWORD(name) == 0) return GetExePtr( LOWORD(name) );
-#endif
+    if (HIWORD(name) == 0) return GetExePtr( (HANDLE)name );
     return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
 }
 
@@ -1185,7 +1181,7 @@
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = (NE_MODULE *)GlobalLock( hModule ))) return 0;
-    dprintf_module( stddeb, "GetModuleUsage("NPFMT"): returning %d\n",
+    dprintf_module( stddeb, "GetModuleUsage(%04x): returning %d\n",
                     hModule, pModule->count );
     return pModule->count;
 }
@@ -1243,7 +1239,7 @@
  */
 void FreeLibrary( HANDLE handle )
 {
-    dprintf_module( stddeb,"FreeLibrary: "NPFMT"\n", handle );
+    dprintf_module( stddeb,"FreeLibrary: %04x\n", handle );
     FreeModule( handle );
 }
 
@@ -1258,6 +1254,7 @@
     HANDLE handle;
     WORD *cmdShowPtr;
     char *p, *cmdline, filename[256];
+    static int use_load_module = 1;
 
     if (!(cmdShowHandle = GlobalAlloc( 0, 2 * sizeof(WORD) ))) return 0;
     if (!(cmdLineHandle = GlobalAlloc( 0, 256 ))) return 0;
@@ -1271,36 +1268,97 @@
       /* Build the filename and command-line */
 
     cmdline = (char *)GlobalLock( cmdLineHandle );
-    strncpy( filename, lpCmdLine, 256 );
-    filename[255] = '\0';
+    lstrcpyn( filename, lpCmdLine, sizeof(filename) - 4 /* for extension */ );
     for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
-    if (*p)
-    {
-        strncpy( cmdline, p + 1, 128 );
-        cmdline[127] = '\0';
-    }
+    if (*p) lstrcpyn( cmdline, p + 1, 128 );
     else cmdline[0] = '\0';
     *p = '\0';
 
       /* Now load the executable file */
 
-#ifdef WINELIB32
-    params.hEnvironment = (HANDLE)GetDOSEnvironment();
-#else
-    params.hEnvironment = (HANDLE)SELECTOROF( GetDOSEnvironment() );
-#endif
-    params.cmdLine  = (SEGPTR)WIN16_GlobalLock( cmdLineHandle );
-    params.showCmd  = (SEGPTR)WIN16_GlobalLock( cmdShowHandle );
-    params.reserved = 0;
-    handle = LoadModule( filename, &params );
-    if (handle == (HANDLE)2)  /* file not found */
+    if (use_load_module)
     {
-	/* Check that the original file name did not have a suffix */
-	p = strrchr(filename, '.');
-        if (p && !(strchr(p, '/') || strchr(p, '\\')))
-            return handle;  /* filename already includes a suffix! */
-        strcat( filename, ".exe" );
-        handle = LoadModule( filename, &params );
+#ifdef WINELIB
+        /* WINELIB: Use LoadModule() only for the program itself */
+        use_load_module = 0;
+	params.hEnvironment = (HANDLE)GetDOSEnvironment();
+#else
+	params.hEnvironment = (HANDLE)SELECTOROF( GetDOSEnvironment() );
+#endif  /* WINELIB */
+	params.cmdLine  = (SEGPTR)WIN16_GlobalLock( cmdLineHandle );
+	params.showCmd  = (SEGPTR)WIN16_GlobalLock( cmdShowHandle );
+	params.reserved = 0;
+	handle = LoadModule( filename, &params );
+	if (handle == 2)  /* file not found */
+	{
+	    /* Check that the original file name did not have a suffix */
+	    p = strrchr(filename, '.');
+	    if (!p || (strchr(p, '/') && strchr(p, '\\')))
+            {
+                p = filename + strlen(filename);
+                strcpy( p, ".exe" );
+                handle = LoadModule( filename, &params );
+                *p = '\0';  /* Remove extension */
+            }
+	}
+    }
+    else handle = 2;
+
+    if (handle < 32)
+    {
+        /* Try to start it as a unix program */
+        if (!fork())
+	{
+            /* Child process */
+            const char *unixfilename;
+            const char *argv[256], **argptr;
+            int iconic = (nCmdShow == SW_SHOWMINIMIZED ||
+                          nCmdShow == SW_SHOWMINNOACTIVE);
+
+            /* get unixfilename */
+            if (strchr(filename, '/') ||
+                strchr(filename, ':') ||
+                strchr(filename, '\\'))
+                unixfilename = DOSFS_GetUnixFileName(filename, 1);
+            else unixfilename = filename;
+
+            if (unixfilename)
+            {
+                /* build argv */
+                argptr = argv;
+                if (iconic) *argptr++ = "-iconic";
+                *argptr++ = unixfilename;
+                p = cmdline;
+                while (1)
+                {
+                    while (*p && (*p == ' ' || *p == '\t')) *p++ = '\0';
+                    if (!*p) break;
+                    *argptr++ = p;
+                    while (*p && *p != ' ' && *p != '\t') p++;
+                }
+                *argptr++ = 0;
+
+                /* Execute */
+                execvp(argv[0], (char**)argv);
+            }
+
+	    /* Failed ! */
+#ifdef WINELIB
+	    /* build argv */
+	    argptr = argv;
+	    *argptr++ = "wine";
+	    if (iconic) *argptr++ = "-iconic";
+	    *argptr++ = lpCmdLine;
+	    *argptr++ = 0;
+
+	    /* Execute */
+	    execvp(argv[0] , (char**)argv);
+
+	    /* Failed ! */
+	    fprintf(stderr, "WinExec: can't exec 'wine %s'\n", lpCmdLine);
+#endif
+	    exit(1);
+	}
     }
 
     GlobalFree( cmdShowHandle );
@@ -1335,20 +1393,20 @@
     if (HIWORD(name) != 0)
     {
         ordinal = MODULE_GetOrdinal( hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
-        dprintf_module( stddeb, "GetProcAddress: "NPFMT" '%s'\n",
+        dprintf_module( stddeb, "GetProcAddress: %04x '%s'\n",
                         hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
     }
     else
     {
         ordinal = LOWORD(name);
-        dprintf_module( stddeb, "GetProcAddress: "NPFMT" %04x\n",
+        dprintf_module( stddeb, "GetProcAddress: %04x %04x\n",
                         hModule, ordinal );
     }
     if (!ordinal) return (FARPROC)0;
 
     ret = MODULE_GetEntryPoint( hModule, ordinal );
 
-    dprintf_module( stddeb, "GetProcAddress: returning "SPFMT"\n", ret );
+    dprintf_module( stddeb, "GetProcAddress: returning %08lx\n", (DWORD)ret );
     return (FARPROC)ret;
 }
 
diff --git a/loader/ne_image.c b/loader/ne_image.c
index a2785c6..1b8c0a6 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -57,7 +57,7 @@
     if (!pSeg->filepos) return TRUE;  /* No file image, just return */
 	
     fd = MODULE_OpenFile( hModule );
-    dprintf_module( stddeb, "Loading segment %d, selector="NPFMT"\n",
+    dprintf_module( stddeb, "Loading segment %d, selector=%04x\n",
                     segnum, pSeg->selector );
     lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET );
     size = pSeg->size ? pSeg->size : 0x10000;
@@ -134,7 +134,7 @@
     read( fd, &count, sizeof(count) );
     if (!count) return TRUE;
 
-    dprintf_fixup( stddeb, "Fixups for %*.*s, segment %d, selector "NPFMT"\n",
+    dprintf_fixup( stddeb, "Fixups for %*.*s, segment %d, selector %04x\n",
                    *((BYTE *)pModule + pModule->name_table),
                    *((BYTE *)pModule + pModule->name_table),
                    (char *)pModule + pModule->name_table + 1,
@@ -173,7 +173,7 @@
             {
                 NE_MODULE *pTarget = (NE_MODULE *)GlobalLock( module );
                 if (!pTarget)
-                    fprintf( stderr, "Module not found: "NPFMT", reference %d of module %*.*s\n",
+                    fprintf( stderr, "Module not found: %04x, reference %d of module %*.*s\n",
                              module, rep->target1, 
                              *((BYTE *)pModule + pModule->name_table),
                              *((BYTE *)pModule + pModule->name_table),
@@ -274,7 +274,7 @@
 	  case NE_RADDR_LOWBYTE:
             do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-                dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x BYTE%s\n",
+                dprintf_fixup(stddeb,"    %04x:%04x:%04x BYTE%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive":"");
                 offset = *sp;
 		if(additive)
@@ -288,7 +288,7 @@
 	  case NE_RADDR_OFFSET16:
 	    do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-		dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x OFFSET16%s\n",
+		dprintf_fixup(stddeb,"    %04x:%04x:%04x OFFSET16%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive" : "" );
 		offset = *sp;
 		*sp = LOWORD(address);
@@ -300,7 +300,7 @@
 	  case NE_RADDR_POINTER32:
 	    do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-		dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x POINTER32%s\n",
+		dprintf_fixup(stddeb,"    %04x:%04x:%04x POINTER32%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive" : "" );
 		offset = *sp;
 		*sp    = LOWORD(address);
@@ -313,7 +313,7 @@
 	  case NE_RADDR_SELECTOR:
 	    do {
                 sp = PTR_SEG_OFF_TO_LIN( pSeg->selector, offset );
-		dprintf_fixup(stddeb,"    "NPFMT":%04x:%04x SELECTOR%s\n",
+		dprintf_fixup(stddeb,"    %04x:%04x:%04x SELECTOR%s\n",
                               pSeg->selector, offset, *sp, additive ? " additive" : "" );
 		offset = *sp;
 		*sp    = HIWORD(address);
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index add76cf..e7e1a6e 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -355,7 +355,7 @@
         }
         pTypeInfo = (NE_TYPEINFO *)pNameInfo;
     }
-    fprintf( stderr, "FreeResource: "NPFMT" "NPFMT" not found!\n", hModule, handle );
+    fprintf( stderr, "FreeResource: %04x %04x not found!\n", hModule, handle );
     return FALSE;
 }
 #endif /* WINELIB */
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 9d68504..e95ade2 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -207,7 +207,7 @@
 
     while(*import_list)
 	{
-	  pe_name = (struct pe_import_name *) ((int) load_addr + *import_list);
+	  pe_name = (struct pe_import_name *) ((int) load_addr + ((unsigned)*import_list & ~0x80000000));
 	  if((unsigned)*import_list & 0x80000000)
 	  {
 		int ordinal=*import_list & (0x80000000-1);
@@ -652,7 +652,7 @@
 
         /* FIXME: Is this really the correct place to initialise the DLL? */
 	if ((wpnt->pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)) {
-            PE_InitDLL(wpnt);
+            PE_InitDLL(hModule);
         } else {
             TASK_CreateTask(hModule,hInstance,0,
 		params->hEnvironment,(LPSTR)PTR_SEG_TO_LIN(params->cmdLine),
diff --git a/loader/resource.c b/loader/resource.c
index 4ded636..dee9027 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -40,7 +40,7 @@
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "FindResource: module="NPFMT" type=", hModule );
+    dprintf_resource(stddeb, "FindResource: module=%04x type=", hModule );
     PrintId( type );
     if (HIWORD(name))  /* Check for '#xxx' name */
     {
@@ -77,7 +77,7 @@
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "LoadResource: module="NPFMT" res="NPFMT"\n",
+    dprintf_resource(stddeb, "LoadResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -107,7 +107,7 @@
     HMODULE hModule;
     WORD *pModule;
 
-    dprintf_resource(stddeb, "LockResource: handle="NPFMT"\n", handle );
+    dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
     if (!handle) return (SEGPTR)0;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -132,7 +132,7 @@
     HMODULE hModule;
     WORD *pModule;
 
-    dprintf_resource(stddeb, "LockResource: handle="NPFMT"\n", handle );
+    dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
     if (!handle) return NULL;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -160,7 +160,7 @@
     HMODULE hModule;
     WORD *pModule;
 
-    dprintf_resource(stddeb, "FreeResource: handle="NPFMT"\n", handle );
+    dprintf_resource(stddeb, "FreeResource: handle=%04x\n", handle );
     if (!handle) return FALSE;
     hModule = GetExePtr( handle );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -187,7 +187,7 @@
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AccessResource: module="NPFMT" res="NPFMT"\n",
+    dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -215,7 +215,7 @@
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "SizeofResource: module="NPFMT" res="NPFMT"\n",
+    dprintf_resource(stddeb, "SizeofResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
 #ifndef WINELIB
@@ -242,7 +242,7 @@
     WORD *pModule;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AllocResource: module="NPFMT" res="NPFMT" size=%ld\n",
+    dprintf_resource(stddeb, "AllocResource: module=%04x res=%04x size=%ld\n",
                      hModule, hRsrc, size );
     if (!hRsrc) return 0;
     if (!(pModule = (WORD *)GlobalLock( hModule ))) return 0;
@@ -268,7 +268,8 @@
  */
 HANDLE DirectResAlloc(HANDLE hInstance, WORD wType, WORD wSize)
 {
-    dprintf_resource(stddeb,"DirectResAlloc("NPFMT",%x,%x)\n",hInstance,wType,wSize);
+    dprintf_resource(stddeb,"DirectResAlloc(%04x,%04x,%04x)\n",
+                     hInstance, wType, wSize );
     hInstance = GetExePtr(hInstance);
     if(!hInstance)return 0;
     if(wType != 0x10)	/* 0x10 is the only observed value, passed from
@@ -291,10 +292,10 @@
     int 	i, n;
 
     if (HIWORD(lpTableName))
-        dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" '%s'\n",
+        dprintf_accel( stddeb, "LoadAccelerators: %04x '%s'\n",
                       instance, (char *)PTR_SEG_TO_LIN( lpTableName ) );
     else
-        dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" %04x\n",
+        dprintf_accel( stddeb, "LoadAccelerators: %04x %04x\n",
                        instance, LOWORD(lpTableName) );
 
     if (!(hRsrc = FindResource( instance, lpTableName, RT_ACCELERATOR )))
@@ -340,7 +341,7 @@
 	msg->message != WM_SYSKEYUP &&
     	msg->message != WM_CHAR) return 0;
 
-    dprintf_accel(stddeb, "TranslateAccelerators hAccel="NPFMT" !\n", hAccel);
+    dprintf_accel(stddeb, "TranslateAccelerators hAccel=%04x !\n", hAccel);
 
     lpAccelTbl = (LPACCELHEADER)GlobalLock(hAccel);
     for (i = 0; i < lpAccelTbl->wCount; i++) {
@@ -387,8 +388,8 @@
     int string_num;
     int i;
 
-    dprintf_resource(stddeb, "LoadString: instance = "NPFMT", id = %04x, buffer = %08x, "
-	   "length = %d\n", instance, resource_id, (int) buffer, buflen);
+    dprintf_resource(stddeb,"LoadString: inst=%04x id=%04x buff=%08x len=%d\n",
+                     instance, resource_id, (int) buffer, buflen);
 
     hrsrc = FindResource( instance, (SEGPTR)((resource_id>>4)+1), RT_STRING );
     if (!hrsrc) return 0;
diff --git a/loader/signal.c b/loader/signal.c
index 3bd175f7..995741b 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -107,6 +107,8 @@
 #endif  /* linux */
 
 #if defined(__NetBSD__) || defined(__FreeBSD__)
+    sigset_t sig_mask;
+    sigemptyset(&sig_mask);
     sig_act.sa_handler = func;
     sig_act.sa_flags = SA_ONSTACK;
     sig_act.sa_mask = sig_mask;
@@ -114,6 +116,8 @@
 #endif  /* __FreeBSD__ || __NetBSD__ */
 
 #if defined (__svr4__)
+    sigset_t sig_mask;
+    sigemptyset(&sig_mask);
     sig_act.sa_handler = func;
     sig_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
     sig_act.sa_mask = sig_mask;
@@ -136,7 +140,6 @@
     extern void stop_wait(int a);
 
 #if defined(__NetBSD__) || defined(__FreeBSD__)
-    sigset_t sig_mask;
     struct sigaltstack ss;
         
 #if !defined (__FreeBSD__) 
@@ -154,11 +157,9 @@
         perror("sigstack");
         exit(1);
     }
-    sigemptyset(&sig_mask);
 #endif  /* __FreeBSD__ || __NetBSD__ */
 
 #if defined (__svr4__)
-    sigset_t sig_mask;
     struct sigaltstack ss;
         
     if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) {
@@ -172,7 +173,6 @@
         perror("sigstack");
         exit(1);
     }
-    sigemptyset(&sig_mask);
 #endif  /* __svr4__ */
 
     SIGNAL_SetHandler( SIGSEGV, (void (*)())win_fault );
diff --git a/loader/task.c b/loader/task.c
index d8a0830..1b6c557 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -555,7 +555,7 @@
 
     TASK_LinkTask( hTask );
 
-    dprintf_task( stddeb, "CreateTask: module='%s' cmdline='%s' task="NPFMT"\n",
+    dprintf_task( stddeb, "CreateTask: module='%s' cmdline='%s' task=%04x\n",
                   name, cmdLine, hTask );
 
     return hTask;
@@ -699,7 +699,7 @@
     if (!hTask) return;  /* Do nothing */
 
     pNewTask = (TDB *)GlobalLock( hTask );
-    dprintf_task( stddeb, "Switching to task "NPFMT" (%.8s)\n",
+    dprintf_task( stddeb, "Switching to task %04x (%.8s)\n",
                   hTask, pNewTask->module_name );
 
       /* Save the stacks of the previous task (if any) */
@@ -939,8 +939,8 @@
     if (!thunkaddr) return (FARPROC)0;
     thunk = PTR_SEG_TO_LIN( thunkaddr );
 
-    dprintf_task( stddeb, "MakeProcInstance("SPFMT","NPFMT"): got thunk "SPFMT"\n",
-                  (SEGPTR)func, hInstance, (SEGPTR)thunkaddr );
+    dprintf_task( stddeb, "MakeProcInstance(%08lx,%04x): got thunk %08lx\n",
+                  (DWORD)func, hInstance, (DWORD)thunkaddr );
     
     *thunk++ = 0xb8;    /* movw instance, %ax */
     *thunk++ = (BYTE)(hInstance & 0xff);
@@ -958,7 +958,7 @@
 void FreeProcInstance( FARPROC func )
 {
 #ifndef WINELIB32
-    dprintf_task( stddeb, "FreeProcInstance("SPFMT")\n", (SEGPTR)func );
+    dprintf_task( stddeb, "FreeProcInstance(%08lx)\n", (DWORD)func );
     TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
 #endif
 }
@@ -969,6 +969,7 @@
  */
 HANDLE GetCodeHandle( FARPROC proc )
 {
+#ifndef WINELIB32
     HANDLE handle;
     BYTE *thunk = (BYTE *)PTR_SEG_TO_LIN( proc );
 
@@ -982,6 +983,9 @@
         handle = GlobalHandle( HIWORD(proc) );
 
     return handle;
+#else
+    return (HANDLE)proc;
+#endif
 }
 
 
@@ -1201,7 +1205,7 @@
     TDB *pTask;
     INSTANCEDATA *pInstData;
 
-    dprintf_toolhelp( stddeb, "TaskNext(%p): task="NPFMT"\n", lpte, lpte->hNext );
+    dprintf_toolhelp( stddeb, "TaskNext(%p): task=%04x\n", lpte, lpte->hNext );
     if (!lpte->hNext) return FALSE;
     pTask = (TDB *)GlobalLock( lpte->hNext );
     if (!pTask || pTask->magic != TDB_MAGIC) return FALSE;
diff --git a/memory/global.c b/memory/global.c
index 3f06b43..78e0081 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -649,7 +649,7 @@
 /***********************************************************************
  *           FarSetOwner   (KERNEL.403)
  */
-void FarSetOwner( HANDLE handle, WORD hOwner )
+void FarSetOwner( HANDLE handle, HANDLE hOwner )
 {
     GET_ARENA_PTR(handle)->hOwner = hOwner;
 }
diff --git a/misc/clipboard.c b/misc/clipboard.c
index 847e891..31049ba 100644
--- a/misc/clipboard.c
+++ b/misc/clipboard.c
@@ -59,7 +59,7 @@
 {
     if (hWndClipboardOwner != 0) return FALSE;
     hWndClipboardOwner = hWnd;
-    dprintf_clipboard(stddeb,"OpenClipboard("NPFMT"); !\n", hWnd);
+    dprintf_clipboard(stddeb,"OpenClipboard(%04x); !\n", hWnd);
     return TRUE;
 }
 
@@ -107,7 +107,7 @@
 HWND GetClipboardOwner()
 {
     dprintf_clipboard(stddeb,
-		"GetClipboardOwner() = "NPFMT" !\n", hWndClipboardOwner);
+		"GetClipboardOwner() = %04x !\n", hWndClipboardOwner);
     return hWndClipboardOwner;
 }
 
@@ -119,7 +119,7 @@
 {
     LPCLIPFORMAT lpFormat = ClipFormats; 
     dprintf_clipboard(stddeb,
-		"SetClipboardDate(%04X, "NPFMT") !\n", wFormat, hData);
+		"SetClipboardDate(%04X, %04x) !\n", wFormat, hData);
     while(TRUE) {
 	if (lpFormat == NULL) return 0;
 	if (lpFormat->wFormatID == wFormat) break;
@@ -173,7 +173,7 @@
 	if (lpFormat == NULL) break;
 	if (lpFormat->hData != 0) {
         dprintf_clipboard(stddeb,
-		"CountClipboardFormats // Find Not Empty ("NPFMT") !\n",
+		"CountClipboardFormats // Find Not Empty (%04x) !\n",
 					lpFormat->hData);
 	    FormatCount++;
 	    }
@@ -211,7 +211,7 @@
 	lpFormat = lpFormat->NextFormat;
 	}
     dprintf_clipboard(stddeb,
-		"EnumClipboardFormats // Find Not Empty Id=%04X hData="NPFMT" !\n",
+		"EnumClipboardFormats // Find Not Empty Id=%04X hData=%04x !\n",
 				lpFormat->wFormatID, lpFormat->hData);
     return lpFormat->wFormatID;
 }
@@ -279,7 +279,7 @@
 HWND SetClipboardViewer(HWND hWnd)
 {
     HWND hwndPrev = hWndViewer;
-    dprintf_clipboard(stddeb,"SetClipboardViewer("NPFMT") !\n", hWnd);
+    dprintf_clipboard(stddeb,"SetClipboardViewer(%04x) !\n", hWnd);
     hWndViewer = hWnd;
     return hwndPrev;
 }
@@ -290,7 +290,7 @@
  */
 HWND GetClipboardViewer()
 {
-    dprintf_clipboard(stddeb,"GetClipboardFormat() = "NPFMT" !\n", hWndViewer);
+    dprintf_clipboard(stddeb,"GetClipboardFormat() = %04x !\n", hWndViewer);
     return hWndViewer;
 }
 
@@ -301,7 +301,7 @@
 BOOL ChangeClipboardChain(HWND hWnd, HWND hWndNext)
 {
     dprintf_clipboard(stdnimp,
-		"ChangeClipboardChain("NPFMT", "NPFMT") !\n", hWnd, hWndNext);
+		"ChangeClipboardChain(%04x, %04x) !\n", hWnd, hWndNext);
 
      return 0;
 }
@@ -331,7 +331,7 @@
 HWND GetOpenClipboardWindow()
 {
     dprintf_clipboard(stddeb,
-		"GetOpenClipboardWindow() = "NPFMT" !\n", hWndClipboardOwner);
+		"GetOpenClipboardWindow() = %04x !\n", hWndClipboardOwner);
     return hWndClipboardOwner;
 }
 
@@ -377,7 +377,7 @@
 	    hText=0;
 	} else {
 	    dprintf_clipboard(stddeb,"Selection is %s\n",val);
-	    hText=GlobalAlloc(GMEM_MOVEABLE, nitems);
+	    hText=GlobalAlloc(GMEM_MOVEABLE, nitems+1);
 	    memcpy(GlobalLock(hText),val,nitems+1);
 	    GlobalUnlock(hText);
 	}
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 9e76ac0..3d242f7 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -295,6 +295,18 @@
 }
 
 /***********************************************************************
+ *                              FILEDLG_HookCallChk             [internal]
+ */
+static int FILEDLG_HookCallChk(LPOPENFILENAME lpofn)
+{
+ if (lpofn)
+  if (lpofn->Flags & OFN_ENABLEHOOK)
+   if (lpofn->lpfnHook)
+    return 1;
+ return 0;   
+} 
+
+/***********************************************************************
  *                              FILEDLG_WMInitDialog            [internal]
  */
 
@@ -372,7 +384,11 @@
     ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
   if (lpofn->Flags & OFN_HIDEREADONLY)
     ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); 
-  return TRUE;
+  if (FILEDLG_HookCallChk(lpofn))
+     return (BOOL)CallWindowProc(lpofn->lpfnHook, 
+               hWnd,  WM_INITDIALOG, wParam,(LPARAM)MAKE_SEGPTR(lpofn));
+  else  
+     return TRUE;
 }
 
 /***********************************************************************
@@ -382,6 +398,7 @@
 {
   LONG lRet;
   LPOPENFILENAME lpofn;
+  OPENFILENAME ofn2;
   char tmpstr[512], tmpstr2[512];
   LPSTR pstr, pstr2;
   UINT control,notification;
@@ -407,6 +424,12 @@
       SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet,
 			 (LPARAM)MAKE_SEGPTR(tmpstr));
       SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (LPARAM)MAKE_SEGPTR(tmpstr));
+
+      if (FILEDLG_HookCallChk(lpofn))
+       CallWindowProc (lpofn->lpfnHook, hWnd,
+                  RegisterWindowMessage(MAKE_SEGPTR(LBSELCHSTRING)), 
+                  control, MAKELONG(lRet,CD_LBSELCHANGE));       
+      /* FIXME: for OFN_ALLOWMULTISELECT we need CD_LBSELSUB, CD_SELADD, CD_LBSELNOITEMS */                  
       return TRUE;
     case lst2: /* directory list */
       FILEDLG_StripEditControl(hWnd);
@@ -454,6 +477,7 @@
       return TRUE;
     case IDOK:
     almost_ok:
+      ofn2=*lpofn; /* for later restoring */
       SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 511, (LPARAM)MAKE_SEGPTR(tmpstr));
       pstr = strrchr(tmpstr, '\\');
       if (pstr == NULL)
@@ -507,7 +531,9 @@
 	}
       else 
 	SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, (LPARAM)MAKE_SEGPTR(tmpstr));
-      ShowWindow(hWnd, SW_HIDE);
+#if 0
+      ShowWindow(hWnd, SW_HIDE);   /* this should not be necessary ?! (%%%) */
+#endif
       {
 	int drive = DRIVE_GetCurrentDrive();
 	tmpstr2[0] = 'A'+ drive;
@@ -535,6 +561,20 @@
           dprintf_commdlg(stddeb,"strcpy'ing '%s'\n",tmpstr); fflush(stdout);
 	  strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
 	}
+      if (FILEDLG_HookCallChk(lpofn))
+      {
+       lRet= (BOOL)CallWindowProc (lpofn->lpfnHook,
+               hWnd, RegisterWindowMessage(MAKE_SEGPTR(FILEOKSTRING)), 
+               0, (LPARAM)MAKE_SEGPTR(lpofn));                        
+       if (lRet)       
+       {
+         *lpofn=ofn2; /* restore old state */
+#if 0
+         ShowWindow(hWnd, SW_SHOW);               /* only if above (%%%) SW_HIDE used */
+#endif         
+         break;
+       }
+      }
       EndDialog(hWnd, TRUE);
       return TRUE;
     case IDCANCEL:
@@ -550,6 +590,15 @@
  */
 LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {  
+ LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
+ 
+ if (wMsg!=WM_INITDIALOG)
+  if (FILEDLG_HookCallChk(lpofn))
+  {
+   LRESULT  lRet=(BOOL)CallWindowProc(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
+   if (lRet)   
+    return lRet;         /* else continue message processing */
+  }             
   switch (wMsg)
     {
     case WM_INITDIALOG:
@@ -584,6 +633,15 @@
  */
 LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
+ LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
+ 
+ if (wMsg!=WM_INITDIALOG)
+  if (FILEDLG_HookCallChk(lpofn))
+  {
+   LRESULT  lRet=(BOOL)CallWindowProc(lpofn->lpfnHook, hWnd, wMsg, wParam, lParam);
+   if (lRet)   
+    return lRet;         /* else continue message processing */
+  }             
   switch (wMsg) {
    case WM_INITDIALOG:
       return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
diff --git a/misc/driver.c b/misc/driver.c
index 7da4990..30567fa 100644
--- a/misc/driver.c
+++ b/misc/driver.c
@@ -33,7 +33,7 @@
         	dprintf_driver(stddeb,"LoadStartupDrivers // str='%s'\n", ptr);
 		hDrv = OpenDriver(ptr, "drivers", 0L);
         	dprintf_driver(stddeb,
-			"LoadStartupDrivers // hDrv="NPFMT"\n", hDrv);
+			"LoadStartupDrivers // hDrv=%04x\n", hDrv);
 		ptr += strlen(ptr) + 1;
 		}
     	dprintf_driver(stddeb,"LoadStartupDrivers // end of list !\n");
@@ -44,7 +44,7 @@
  */
 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2)
 {
-	dprintf_driver(stdnimp,"SendDriverMessage("NPFMT", %04X, %08lX, %08lX);\n",
+	dprintf_driver(stdnimp,"SendDriverMessage(%04x, %04X, %08lX, %08lX);\n",
 						hDriver, msg, lParam1, lParam2);
         return 0;
 }
@@ -93,7 +93,7 @@
 		lpnewdrv->lpPrevItem = lpdrv;
 		}
 	lpnewdrv->lpDrvProc = NULL;
-    	dprintf_driver(stddeb,"OpenDriver // hDrvr="NPFMT" loaded !\n", hDrvr);
+    	dprintf_driver(stddeb,"OpenDriver // hDrvr=%04x loaded !\n", hDrvr);
 	return hDrvr;
 }
 
@@ -104,7 +104,7 @@
 {
 	LPDRIVERITEM	lpdrv;
     	dprintf_driver(stddeb,
-		"CloseDriver("NPFMT", %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
+		"CloseDriver(%04x, %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr) {
 		if (lpdrv->lpPrevItem)
@@ -113,7 +113,7 @@
 			((LPDRIVERITEM)lpdrv->lpNextItem)->lpPrevItem = lpdrv->lpPrevItem;
 		GlobalUnlock(hDrvr);
 		GlobalFree(hDrvr);
-        dprintf_driver(stddeb,"CloseDriver // hDrvr="NPFMT" closed !\n", hDrvr);
+        dprintf_driver(stddeb,"CloseDriver // hDrvr=%04x closed !\n", hDrvr);
 		return TRUE;
 		}
 	return FALSE;
@@ -126,7 +126,7 @@
 {
 	LPDRIVERITEM	lpdrv;
 	HANDLE			hModule = 0;
-    	dprintf_driver(stddeb,"GetDriverModuleHandle("NPFMT");\n", hDrvr);
+    	dprintf_driver(stddeb,"GetDriverModuleHandle(%04x);\n", hDrvr);
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv != NULL) {
 		hModule = lpdrv->dis.hModule;
@@ -175,7 +175,7 @@
 BOOL GetDriverInfo(HDRVR hDrvr, LPDRIVERINFOSTRUCT lpDrvInfo)
 {
 	LPDRIVERITEM	lpdrv;
-    	dprintf_driver(stddeb,"GetDriverInfo("NPFMT", %p);\n", hDrvr, lpDrvInfo);
+    	dprintf_driver(stddeb,"GetDriverInfo(%04x, %p);\n", hDrvr, lpDrvInfo);
 	if (lpDrvInfo == NULL) return FALSE;
 	lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr);
 	if (lpdrv == NULL) return FALSE;
@@ -191,7 +191,7 @@
 {
 	LPDRIVERITEM	lpdrv;
 	HDRVR			hRetDrv = 0;
-    	dprintf_driver(stddeb,"GetNextDriver("NPFMT", %08lX);\n", hDrvr, dwFlags);
+    	dprintf_driver(stddeb,"GetNextDriver(%04x, %08lX);\n", hDrvr, dwFlags);
 	if (hDrvr == 0) {
 		if (lpDrvItemList == NULL) {
             		dprintf_driver(stddeb,
@@ -199,7 +199,7 @@
 			LoadStartupDrivers();
 			if (lpDrvItemList == NULL) return 0;
 			}
-        	dprintf_driver(stddeb,"GetNextDriver // return first "NPFMT" !\n",
+        	dprintf_driver(stddeb,"GetNextDriver // return first %04x !\n",
 					lpDrvItemList->dis.hDriver);
 		return lpDrvItemList->dis.hDriver;
 		}
@@ -215,7 +215,7 @@
 			}
 		GlobalUnlock(hDrvr);
 		}
-    	dprintf_driver(stddeb,"GetNextDriver // return "NPFMT" !\n", hRetDrv);
+    	dprintf_driver(stddeb,"GetNextDriver // return %04x !\n", hRetDrv);
 	return hRetDrv;
 }
 
diff --git a/misc/exec.c b/misc/exec.c
index fc0131b..e66f09f 100644
--- a/misc/exec.c
+++ b/misc/exec.c
@@ -55,7 +55,7 @@
  */
 BOOL ExitWindows( DWORD dwReturnCode, WORD wReserved )
 {
-    HWND hwnd, hwndDesktop;
+    HWND hwndDesktop;
     WND *wndPtr;
     HWND *list, *pWnd;
     int count, i;
@@ -70,22 +70,16 @@
 
     hwndDesktop = GetDesktopWindow();
     count = 0;
-    for (hwnd = GetTopWindow(hwndDesktop); hwnd != 0; hwnd = wndPtr->hwndNext)
-    {
-        if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    for (wndPtr = WIN_GetDesktop()->child; wndPtr; wndPtr = wndPtr->next)
         count++;
-    }
     if (!count) /* No windows, we can exit at once */
         EXEC_ExitWindows( LOWORD(dwReturnCode) );
 
       /* Now build the list of all windows */
 
-    if (!(list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
-    for (hwnd = GetTopWindow(hwndDesktop), pWnd = list; hwnd != 0; hwnd = wndPtr->hwndNext)
-    {
-        wndPtr = WIN_FindWndPtr( hwnd );
-        *pWnd++ = hwnd;
-    }
+    if (!(pWnd = list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
+    for (wndPtr = WIN_GetDesktop()->child; wndPtr; wndPtr = wndPtr->next)
+        *pWnd++ = wndPtr->hwndSelf;
 
       /* Now send a WM_QUERYENDSESSION message to every window */
 
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 57e5c8c..4b4b500 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -263,7 +263,7 @@
 	BYTE	*buf;
 	struct	lzstate	*lzs;
 
-	dprintf_file(stddeb,"LZRead(%d,%08lx,%d)\n",fd,segbuf,toread);
+	dprintf_file(stddeb,"LZRead(%d,%08lx,%d)\n",fd,(DWORD)segbuf,toread);
 	howmuch=toread;
 	for (i=0;i<nroflzstates;i++)
 		if (lzstates[i].lzfd==fd)
diff --git a/misc/main.c b/misc/main.c
index eb19885..34f3b95 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -831,6 +831,66 @@
     return envtable;
 }
 
+
+LPVOID GetEnvironmentStringsW(void)
+{
+    int count,len;
+    LPENVENTRY lpEnv;
+    char *envtable, *envptr;
+	WCHAR *wenvtable;
+
+    /* Count the total number of bytes we'll need for the string
+     * table.  Include the trailing nuls and the final double nul.
+     */
+    count = 1;
+    lpEnv = lpEnvList;
+    while(lpEnv != NULL)
+    {
+        if(lpEnv->Name != NULL)
+        {
+            count += strlen(lpEnv->Name) + 1;
+            count += strlen(lpEnv->Value) + 1;
+        }
+        lpEnv = lpEnv->Next;
+    }
+
+	len=count;
+    envtable = malloc(count);
+    if(envtable)
+    {
+        lpEnv = lpEnvList;
+        envptr = envtable;
+
+        while(lpEnv != NULL)
+        {
+            if(lpEnv->Name != NULL)
+            {
+                count = sprintf(envptr, "%s=%s", lpEnv->Name, lpEnv->Value);
+                envptr += count + 1;
+            }
+            lpEnv = lpEnv->Next;
+        }
+        *envptr = '\0';
+    }
+
+	wenvtable = malloc(2*len);
+	for(count=0;count<len;count++)
+		wenvtable[count]=(WCHAR)envtable[count];
+	free(envtable);
+
+    return envtable;
+}
+
+void FreeEnvironmentStringsA(void *e)
+{
+	free(e);
+}
+
+void FreeEnvironmentStringsW(void* e)
+{
+	free(e);
+}
+
 /***********************************************************************
  *	GetTimerResolution (USER.14)
  */
diff --git a/misc/network.c b/misc/network.c
index 6840755..0713f8d 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -117,7 +117,7 @@
  */
 int WNetWatchQueue(HWND hWnd,LPSTR szLocal,LPSTR szUser,WORD nQueue)
 {
-	printf("EMPTY STUB !!! WNetWatchQueue("NPFMT",'%s','%s',%x)\n",
+	printf("EMPTY STUB !!! WNetWatchQueue(%04x,'%s','%s',%x)\n",
 		hWnd,szLocal,szUser,nQueue);
 	return WN_NET_ERROR;
 }
@@ -193,7 +193,7 @@
  */
 int WNetDeviceMode(HWND hWndOwner)
 {
-	printf("EMPTY STUB !!! WNetDeviceMode("NPFMT")\n",hWndOwner);
+	printf("EMPTY STUB !!! WNetDeviceMode(%04x)\n",hWndOwner);
 	return WN_NET_ERROR;
 }
 
@@ -202,7 +202,7 @@
  */
 int WNetBrowseDialog(HWND hParent,WORD nType,LPSTR szPath)
 {
-	printf("EMPTY STUB !!! WNetBrowseDialog("NPFMT",%x,'%s')\n",
+	printf("EMPTY STUB !!! WNetBrowseDialog(%04x,%x,'%s')\n",
 		hParent,nType,szPath);
 	return WN_NET_ERROR;
 }
@@ -262,7 +262,7 @@
  */
 int WNetRestoreConnection(HWND hwndOwner,LPSTR lpszDevice)
 {
-	printf("EMPTY STUB !!! WNetRestoreConnection("NPFMT",'%s')\n",
+	printf("EMPTY STUB !!! WNetRestoreConnection(%04x,'%s')\n",
 		hwndOwner,lpszDevice);
 	return WN_NET_ERROR;
 }
@@ -272,7 +272,7 @@
  */
 int WNetWriteJob(HANDLE hJob,void *lpData,LPWORD lpcbData)
 {
-	printf("EMPTY STUB !!! WNetWriteJob("NPFMT",%p,%p)\n",
+	printf("EMPTY STUB !!! WNetWriteJob(%04x,%p,%p)\n",
 		hJob,lpData,lpcbData);
 	return WN_NET_ERROR;
 }
@@ -282,7 +282,7 @@
  */
 UINT WNetConnectDialog(HWND hWndParent, WORD iType)
 {
-	printf("EMPTY STUB !!! WNetConnectDialog("NPFMT", %4X)\n", hWndParent, iType);
+	printf("EMPTY STUB !!! WNetConnectDialog(%04x, %4X)\n", hWndParent, iType);
 	return WN_SUCCESS;
 }
 
@@ -291,7 +291,7 @@
  */
 int WNetDisconnectDialog(HWND hwndOwner, WORD iType)
 {
-	printf("EMPTY STUB !!! WNetDisconnectDialog("NPFMT",%x)\n",
+	printf("EMPTY STUB !!! WNetDisconnectDialog(%04x,%x)\n",
 		hwndOwner,iType);
 	return WN_NET_ERROR;
 }
@@ -301,7 +301,7 @@
  */
 UINT WNetConnectionDialog(HWND hWndParent, WORD iType)
 {
-	printf("EMPTY STUB !!! WNetConnectionDialog("NPFMT", %4X)\n", 
+	printf("EMPTY STUB !!! WNetConnectionDialog(%04x, %4X)\n", 
 		hWndParent, iType);
 	return WN_SUCCESS;
 }
@@ -311,7 +311,7 @@
  */
 int WNetViewQueueDialog(HWND hwndOwner,LPSTR lpszQueue)
 {
-	printf("EMPTY STUB !!! WNetViewQueueDialog("NPFMT",'%s')\n",
+	printf("EMPTY STUB !!! WNetViewQueueDialog(%04x,'%s')\n",
 		hwndOwner,lpszQueue);
 	return WN_NET_ERROR;
 }
@@ -322,7 +322,7 @@
 int WNetPropertyDialog(HWND hwndParent,WORD iButton,
 	WORD nPropSel,LPSTR lpszName,WORD nType)
 {
-	printf("EMPTY STUB !!! WNetPropertyDialog("NPFMT",%x,%x,'%s',%x)\n",
+	printf("EMPTY STUB !!! WNetPropertyDialog(%04x,%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
 	return WN_NET_ERROR;
 }
@@ -342,7 +342,7 @@
  */
 int WNetDirectoryNotify(HWND hwndOwner,void *lpDir,WORD wOper)
 {
-	printf("EMPTY STUB !!! WNetDirectoryNotify("NPFMT",%p,%x)\n",
+	printf("EMPTY STUB !!! WNetDirectoryNotify(%04x,%p,%x)\n",
 		hwndOwner,lpDir,wOper);
 	return WN_NET_ERROR;
 }
@@ -353,7 +353,7 @@
 int WNetGetPropertyText(HWND hwndParent,WORD iButton,WORD nPropSel,
 	LPSTR lpszName,WORD nType)
 {
-	printf("EMPTY STUB !!! WNetGetPropertyText("NPFMT",%x,%x,'%s',%x)\n",
+	printf("EMPTY STUB !!! WNetGetPropertyText(%04x,%x,%x,'%s',%x)\n",
 		hwndParent,iButton,nPropSel,lpszName,nType);
 	return WN_NET_ERROR;
 }
@@ -374,7 +374,7 @@
  */
 UINT WNetCloseEnum(HANDLE hEnum)
 {
-	printf("EMPTY STUB !!! WNetCloseEnum("NPFMT");\n", hEnum);
+	printf("EMPTY STUB !!! WNetCloseEnum(%04x);\n", hEnum);
 	return WN_NET_ERROR;
 }
 
@@ -384,7 +384,7 @@
 UINT WNetEnumResource(HANDLE hEnum, DWORD cRequ, 
 				DWORD *lpCount, LPVOID lpBuf)
 {
-	printf("EMPTY STUB !!! WNetEnumResource("NPFMT", %08lX, %p, %p);\n", 
+	printf("EMPTY STUB !!! WNetEnumResource(%04x, %08lX, %p, %p);\n", 
 							hEnum, cRequ, lpCount, lpBuf);
 	return WN_NET_ERROR;
 }
@@ -396,7 +396,7 @@
 	LPNETRESOURCE lpNet, HANDLE FAR *lphEnum)
 {
 	printf("EMPTY STUB !!! WNetOpenEnum(%08lX, %08lX, %p, %p);\n",
-							dwScope, dwType, lpNet, lphEnum);
+               dwScope, dwType, lpNet, lphEnum);
 	return WN_NET_ERROR;
 }
 
diff --git a/misc/olecli.c b/misc/olecli.c
index ca5ca9d..adf9a72 100644
--- a/misc/olecli.c
+++ b/misc/olecli.c
@@ -52,6 +52,6 @@
  */
 BOOL WINAPI OleIsDcMeta(HDC hdc)
 {
-	dprintf_ole(stddeb,"OleIsDCMeta("NPFMT")\n",hdc);
+	dprintf_ole(stddeb,"OleIsDCMeta(%04x)\n",hdc);
 	return GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ) != 0;
 }
diff --git a/misc/rect.c b/misc/rect.c
index 3d2bc8c..68eb462 100644
--- a/misc/rect.c
+++ b/misc/rect.c
@@ -3,8 +3,7 @@
  *
  * Copyright 1993 Alexandre Julliard
  *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
-*/
+ */
 
 #include "windows.h"
 
diff --git a/misc/shell.c b/misc/shell.c
index 2c46817..12aea21 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -229,6 +229,7 @@
 	  lpKey = lphTopKey; break;
         case HKEY_CLASSES_ROOT: /* == 1 */
         case 0x80000000:
+        case 0x80000001:
           lpKey = lphRootKey; break;
         default: 
 	  dprintf_reg(stddeb,"RegOpenKey // specific key = %08lX !\n", (DWORD)hKey);
@@ -442,6 +443,7 @@
 	  lpKey = lphTopKey; break;
         case HKEY_CLASSES_ROOT: /* == 1 */
         case 0x80000000:
+        case 0x80000001:
           lpKey = lphRootKey; break;
         default: 
 	  dprintf_reg(stddeb,"RegEnumKey // specific key = %08lX !\n", (DWORD)hKey);
@@ -470,7 +472,7 @@
 void DragAcceptFiles(HWND hWnd, BOOL b)
 {
     /* flips WS_EX_ACCEPTFILES bit according to the value of b */
-    dprintf_reg(stddeb,"DragAcceptFiles("NPFMT", %u) old exStyle %08lx\n",
+    dprintf_reg(stddeb,"DragAcceptFiles(%04x, %u) old exStyle %08lx\n",
 		hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
 
     SetWindowLong(hWnd,GWL_EXSTYLE,
@@ -491,7 +493,7 @@
     LPSTR lpCurrent;
     WORD  i;
     
-    dprintf_reg(stddeb,"DragQueryFile("NPFMT", %i, %p, %u)\n",
+    dprintf_reg(stddeb,"DragQueryFile(%04x, %i, %p, %u)\n",
 		hDrop,wFile,lpszFile,wLength);
     
     lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop); 
@@ -563,7 +565,7 @@
      * we have to pass the parameters. If an instance is already running,
      * we might have to send DDE commands.
      */
-    dprintf_exec(stddeb, "ShellExecute("NPFMT",'%s','%s','%s','%s',%x)\n",
+    dprintf_exec(stddeb, "ShellExecute(%04x,'%s','%s','%s','%s',%x)\n",
 		hWnd, lpOperation ? lpOperation:"<null>", lpFile ? lpFile:"<null>",
 		lpParameters ? lpParameters : "<null>", 
 		lpDirectory ? lpDirectory : "<null>", iShowCmd);
@@ -719,7 +721,7 @@
 {
 	HICON	hIcon = 0;
 	HINSTANCE hInst2 = hInst;
-	dprintf_reg(stddeb, "ExtractIcon("NPFMT", '%s', %d\n", 
+	dprintf_reg(stddeb, "ExtractIcon(%04x, '%s', %d\n", 
 			hInst, lpszExeFileName, nIconIndex);
         return 0;
 	if (lpszExeFileName != NULL) {
diff --git a/misc/spy.c b/misc/spy.c
index 065387c..f42791d 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -432,7 +432,7 @@
     switch(iFlag)
     {
     case SPY_DISPATCHMESSAGE:
-        dprintf_message(stddeb,"("NPFMT") message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
+        dprintf_message(stddeb,"(%04x) message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
                         hWnd, msg, SPY_GetMsgName( msg ),
                         wParam, lParam);
         break;
@@ -443,10 +443,10 @@
             HTASK hTask = GetWindowTask(hWnd);
             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
             else if (!hTask) strcpy( taskName, "Wine" );
-            else sprintf( taskName, "task "NPFMT" %s",
+            else sprintf( taskName, "task %04x %s",
                           hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
 
-            dprintf_message(stddeb,"%*s("NPFMT") message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
+            dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
                             SPY_IndentLevel, "", hWnd, msg,
                             SPY_GetMsgName( msg ), taskName, wParam, lParam );
             SPY_IndentLevel += SPY_INDENT_UNIT;
@@ -454,7 +454,7 @@
         break;   
 
     case SPY_DEFWNDPROC:
-        dprintf_message(stddeb, "%*s("NPFMT") DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
+        dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
                         msg, wParam, lParam );
         break;
@@ -473,12 +473,12 @@
     switch(iFlag)
     {
     case SPY_RESULT_INVALIDHWND: 
-        dprintf_message(stddeb,"%*s("NPFMT") message [%04x] %s HAS INVALID HWND\n",
+        dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n",
                         SPY_IndentLevel, "", hWnd, msg,
                         SPY_GetMsgName( msg ) );
         break;
     case SPY_RESULT_OK:
-        dprintf_message(stddeb,"%*s("NPFMT") message [%04x] %s returned %08lx\n",
+        dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n",
                         SPY_IndentLevel, "", hWnd, msg,
                         SPY_GetMsgName( msg ), lReturn );
         break;
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 05e1ecf..cd69bc0 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -49,7 +49,13 @@
 #pragma pack(1)
 #endif
 
-#define IPC_PACKET_SIZE (sizeof(struct ipc_packet) - sizeof(long))
+#define WINSOCK_MAX_SOCKETS	256
+#define WINSOCK_MAX_UDPDG	1024
+
+/* we are out by two with the following, is it due to byte alignment?
+ * #define IPC_PACKET_SIZE (sizeof(struct ipc_packet) - sizeof(long)) 
+ */
+#define IPC_PACKET_SIZE (sizeof(struct ipc_packet) - sizeof(long) - 2)
 /*#define MTYPE 0xb0b0eb05*/
 #define MTYPE 0x30b0eb05
 
@@ -152,8 +158,7 @@
                 fprintf(stderr, "winsock: errno %d, (%s).\n", 
                 			errno, sys_errlist[errno]);
 #else
-                fprintf(stderr, "winsock: errno %d, (%s).\n", 
-					errno, strerror(errno));
+                fprintf(stderr, "winsock: errno %d\n", errno);
 #endif
 #else
                 fprintf(stderr, "winsock: errno %d\n", errno);
@@ -242,8 +247,8 @@
 
         switch(h_errno)
         {
-	case TRY_AGAIN:		return WSATRY_AGAIN;
 	case HOST_NOT_FOUND:	return WSAHOST_NOT_FOUND;
+	case TRY_AGAIN:		return WSATRY_AGAIN;
 	case NO_RECOVERY:	return WSANO_RECOVERY;
 	case NO_DATA:		return WSANO_DATA; 
 /* just in case we ever get here and there are no problems */
@@ -380,6 +385,11 @@
 
 	dprintf_winsock(stddeb, "WSA_accept: socket %d, ptr %8x, length %d\n", s, (int) addr, *addrlen);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return INVALID_SOCKET;
+	}
+
 	if ((sock = accept(s, addr, (int *) addrlen)) < 0) {
         	errno_to_wsaerrno();
         	return INVALID_SOCKET;
@@ -389,11 +399,38 @@
 
 INT WINSOCK_bind(SOCKET s, struct sockaddr *name, INT namelen)
 {
+
 	dprintf_winsock(stddeb, "WSA_bind: socket %d, ptr %8x, length %d\n", s, (int) name, namelen);
 	dump_sockaddr(name);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
+	if (namelen < sizeof(*name)) {
+		WSASetLastError(WSAEFAULT);
+		return SOCKET_ERROR;
+	}
+
+	/* check the socket family */
+	if ( ((struct sockaddr_in *)name)->sin_family != AF_INET ) {
+		WSASetLastError(WSAEAFNOSUPPORT);
+		return SOCKET_ERROR;
+	}
+
 	if (bind(s, name, namelen) < 0) {
-        	errno_to_wsaerrno();
+		switch(errno) {
+		case EBADF:
+			WSASetLastError(WSAENOTSOCK);
+			break;
+		case EADDRNOTAVAIL:
+			WSASetLastError(WSAEINVAL);
+			break;
+		default:
+			errno_to_wsaerrno();
+			break;
+		}
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -403,10 +440,18 @@
 {
 	dprintf_winsock(stddeb, "WSA_closesocket: socket %d\n", s);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	FD_CLR(s, &fd_in_use);
 
 	if (close(s) < 0) {
-        	errno_to_wsaerrno();
+		if (errno == EBADF)
+			WSASetLastError(WSAENOTSOCK);
+		else
+        		errno_to_wsaerrno();
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -417,6 +462,11 @@
 	dprintf_winsock(stddeb, "WSA_connect: socket %d, ptr %8x, length %d\n", s, (int) name, namelen);
 	dump_sockaddr(name);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if (connect(s, name, namelen) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -429,6 +479,11 @@
 	dprintf_winsock(stddeb, "WSA_getpeername: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, *namelen);
 	dump_sockaddr(name);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if (getpeername(s, name, (int *) namelen) < 0) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -443,6 +498,12 @@
 INT WINSOCK_getsockname(SOCKET s, struct sockaddr *name, INT *namelen)
 {
 	dprintf_winsock(stddeb, "WSA_getsockname: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, (int) *namelen);
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if (getsockname(s, name, (int *) namelen) < 0) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -458,10 +519,19 @@
 WINSOCK_getsockopt(SOCKET s, INT level, INT optname, char *optval, INT *optlen)
 {
 	dprintf_winsock(stddeb, "WSA_getsockopt: socket: %d, opt %d, ptr %8x, ptr %8x\n", s, level, (int) optval, (int) *optlen);
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	convert_sockopt(&level, &optname);
 
 	if (getsockopt(s, (int) level, optname, optval, (int *) optlen) < 0) {
-        	errno_to_wsaerrno();
+		if (errno == EBADF)
+			WSASetLastError(WSAENOTSOCK);
+		else
+        		errno_to_wsaerrno();
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -505,6 +575,11 @@
 	char *ctlname;
 	dprintf_winsock(stddeb, "WSA_ioctl: socket %d, cmd %lX, ptr %8x\n", s, cmd, (int) argp);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	/* Why can't they all use the same ioctl numbers */
 	newcmd=cmd;
 	newargp=argp;
@@ -532,7 +607,10 @@
 	
 
 	if (ioctl(s, newcmd, newargp) < 0) {
-        	errno_to_wsaerrno();
+		if (errno == EBADF)
+			WSASetLastError(WSAENOTSOCK);
+		else
+        		errno_to_wsaerrno();
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -542,6 +620,11 @@
 {
 	dprintf_winsock(stddeb, "WSA_listen: socket %d, backlog %d\n", s, backlog);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if (listen(s, backlog) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -565,6 +648,11 @@
 
 	dprintf_winsock(stddeb, "WSA_recv: socket %d, ptr %8x, length %d, flags %d\n", s, (int) buf, len, flags);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if ((length = recv(s, buf, len, flags)) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -579,6 +667,11 @@
 
 	dprintf_winsock(stddeb, "WSA_recvfrom: socket %d, ptr %8lx, length %d, flags %d\n", s, (unsigned long)buf, len, flags);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if ((length = recvfrom(s, buf, len, flags, from, fromlen)) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -591,6 +684,11 @@
 {
 	dprintf_winsock(stddeb, "WSA_select: fd # %d, ptr %8lx, ptr %8lx, ptr %8lX\n", nfds, (unsigned long) readfds, (unsigned long) writefds, (unsigned long) exceptfds);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+/* FIXME */
 	return(select(nfds, readfds, writefds, exceptfds, timeout));
 }
 
@@ -600,6 +698,11 @@
 
 	dprintf_winsock(stddeb, "WSA_send: socket %d, ptr %8lx, length %d, flags %d\n", s, (unsigned long) buf, len, flags);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if ((length = send(s, buf, len, flags)) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -614,6 +717,11 @@
 
 	dprintf_winsock(stddeb, "WSA_sendto: socket %d, ptr %8lx, length %d, flags %d\n", s, (unsigned long) buf, len, flags);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if ((length = sendto(s, buf, len, flags, to, tolen)) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -627,6 +735,11 @@
 	dprintf_winsock(stddeb, "WSA_setsockopt: socket %d, level %d, opt %d, ptr %8x, len %d\n", s, level, optname, (int) optval, optlen);
 	convert_sockopt(&level, &optname);
 	
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if (setsockopt(s, level, optname, optval, optlen) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -638,6 +751,11 @@
 {
 	dprintf_winsock(stddeb, "WSA_shutdown: socket s %d, how %d\n", s, how);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	if (shutdown(s, how) < 0) {
         	errno_to_wsaerrno();
         	return SOCKET_ERROR;
@@ -651,24 +769,73 @@
 
     dprintf_winsock(stddeb, "WSA_socket: af=%d type=%d protocol=%d\n", af, type, protocol);
 
-    if ((sock = socket(af, type, protocol)) < 0) {
-        if (errno != EPERM) {
-            errno_to_wsaerrno();
-        } else {
-             /* NOTE: EPERM does not always map to WSAESOCKTNOSUPPORT
-              * so this is done as a special case
-              */
-             /* non super-user wants a raw socket */
-             dprintf_winsock(stderr, "WSA_socket: not enough privileges\n");
-             WSASetLastError(WSAESOCKTNOSUPPORT);
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return INVALID_SOCKET;
+	}
+
+    /* check the socket family */
+    switch(af) {
+    case AF_INET:
+    case AF_UNSPEC:
+        break;
+    default:
+        WSASetLastError(WSAEAFNOSUPPORT);
+        return INVALID_SOCKET;
+        break;
+    }
+
+    /* check the socket type */
+    switch(type) {
+    case SOCK_STREAM:
+    case SOCK_DGRAM:
+    case SOCK_RAW:
+        break;
+    default:
+        WSASetLastError(WSAESOCKTNOSUPPORT);
+        return INVALID_SOCKET;
+        break;
+    }
+
+    /* check the protocol type */
+    if ( protocol < 0 ) { /* don't support negative values */
+        WSASetLastError(WSAEPROTONOSUPPORT);
+        return INVALID_SOCKET;
+    }
+
+    if ( af == AF_UNSPEC) { /* did they not specify the address family? */
+        switch(protocol) {
+        case IPPROTO_TCP:
+             if (type == SOCK_STREAM) {
+                 af = AF_INET;
+                 break;
+             }
+        case IPPROTO_UDP:
+             if (type == SOCK_DGRAM) {
+                 af = AF_INET;
+                 break;
+             }
+        default:
+             WSASetLastError(WSAEPROTOTYPE);
+             return INVALID_SOCKET;
+             break;
         }
-            dprintf_winsock(stddeb, "WSA_socket: failed !\n");
-            return INVALID_SOCKET;
+    }
+
+    if ((sock = socket(af, type, protocol)) < 0) {
+        if (errno == EPERM) {
+            /* non super-user wants a raw socket */
+            fprintf(stderr, "WSA_socket: not enough privileges\n");
+            WSASetLastError(WSAESOCKTNOSUPPORT);
+        } else
+            errno_to_wsaerrno();
+        dprintf_winsock(stddeb, "WSA_socket: failed !\n");
+        return INVALID_SOCKET;
     }
     
-    if (sock > 0xffff) {
-	/* we only support socket numbers up to 0xffff. The return
-	 * value indicates there are no more descriptors available
+    if (sock > WINSOCK_MAX_SOCKETS) {
+	/* we only support socket numbers up to WINSOCK_MAX_SOCKETS.
+	 * The return value indicates no more descriptors are available
 	 */
         WSASetLastError(WSAEMFILE);
 	return INVALID_SOCKET;
@@ -689,6 +856,11 @@
 
 	dprintf_winsock(stddeb, "WSA_gethostbyaddr: ptr %8x, len %d, type %d\n", (int) addr, len, type);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return NULL;
+	}
+
 	if ((host = gethostbyaddr(addr, len, type)) == NULL) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -711,6 +883,11 @@
 
 	dprintf_winsock(stddeb, "WSA_gethostbyname: %s\n", name);
 
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return NULL;
+	}
+
 	if ((host = gethostbyname(name)) == NULL) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -728,12 +905,16 @@
 {
 	dprintf_winsock(stddeb, "WSA_gethostname: name %s, len %d\n", name, namelen);
 
+	if (!wsa_initted) {
+		WSASetLastError(WSANOTINITIALISED);
+        	return SOCKET_ERROR;
+	}
+
 	if (gethostname(name, namelen) < 0) {
-		if (h_errno < 0) {
-        		errno_to_wsaerrno();
-		} else {
-			herrno_to_wsaerrno();
-		}
+		if (errno == EINVAL)
+			WSASetLastError(WSAEFAULT);
+		else
+			errno_to_wsaerrno();
         	return SOCKET_ERROR;
 	}
 	return 0;
@@ -748,6 +929,11 @@
 
 	dprintf_winsock(stddeb, "WSA_getprotobyname: name %s\n", name);
 
+	if (!wsa_initted) {
+		WSASetLastError(WSANOTINITIALISED);
+        	return NULL;
+	}
+
 	if ((proto = getprotobyname(name)) == NULL) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -770,12 +956,20 @@
 
 	dprintf_winsock(stddeb, "WSA_getprotobynumber: num %d\n", number);
 
+	if (!wsa_initted) {
+		WSASetLastError(WSANOTINITIALISED);
+        	return NULL;
+	}
+
 	if ((proto = getprotobynumber(number)) == NULL) {
+#if 0
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
 		} else {
 			herrno_to_wsaerrno();
 		}
+#endif
+		WSASetLastError(WSANO_DATA);
         	return NULL;
 	}
 	CONVERT_PROTOENT(&Heap->protoent_number, proto);
@@ -795,6 +989,11 @@
 
 	dprintf_winsock(stddeb, "WSA_getservbyname: name %s, proto %s\n", name, proto);
 
+	if (!wsa_initted) {
+		WSASetLastError(WSANOTINITIALISED);
+        	return NULL;
+	}
+
 	if ((service = getservbyname(name, proto)) == NULL) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -817,6 +1016,11 @@
 
 	dprintf_winsock(stddeb, "WSA_getservbyport: port %d, name %s\n", port, proto);
 
+	if (!wsa_initted) {
+		WSASetLastError(WSANOTINITIALISED);
+        	return NULL;
+	}
+
 	if ((service = getservbyport(port, proto)) == NULL) {
 		if (h_errno < 0) {
         		errno_to_wsaerrno();
@@ -833,7 +1037,7 @@
 /******************** winsock specific functions ************************
  *
  */
-static HANDLE new_handle = 0;
+static HANDLE new_handle = 1;
 
 static HANDLE AllocWSAHandle(void)
 {
@@ -843,15 +1047,17 @@
 static void recv_message(int sig)
 {
 	static struct ipc_packet message;
-	static int message_is_valid = 0;
+	int message_is_valid = 0;
 	BOOL result;
 
+	message.mtype = MTYPE;
+
 	signal(SIGUSR1, recv_message);
 	while (1) {
 
 		if (!message_is_valid) {
 			if (msgrcv(wine_key, (struct msgbuf*)&(message), 
-				   IPC_PACKET_SIZE, MTYPE, IPC_NOWAIT) == -1) {
+				   IPC_PACKET_SIZE, 0 /*MTYPE*/, IPC_NOWAIT) == -1) {
 				perror("wine: winsock: msgrcv");
 				break;
 			}
@@ -859,7 +1065,7 @@
 
 		result = PostMessage(message.hWnd, message.wMsg,
 				     (WPARAM)message.handle, message.lParam);
-		if (result == FALSE) {
+		if (result != FALSE) {
 			message_is_valid = 1;
 			break;
 		}
@@ -868,6 +1074,8 @@
 		
 	}
 		
+    if ((wine_key = msgget(IPC_PRIVATE, 0600)) == -1)
+	perror("wine: winsock: msgget"); 
 }
 
 
@@ -884,7 +1092,7 @@
 	if (msgsnd(wine_key, (struct msgbuf*)&(message),  
 		   IPC_PACKET_SIZE, 0/*IPC_NOWAIT*/) == -1)
 		perror("wine: winsock: msgsnd");
-		
+
 	kill(getppid(), SIGUSR1);
 }
 
@@ -894,10 +1102,18 @@
 {
 	HANDLE handle;
 	struct hostent *host;
+	int newpid;
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return 0;
+	}
 
 	handle = AllocWSAHandle();
 
-	if (fork()) {
+	newpid = fork();
+	if (newpid) {
+		dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
 		return handle;
 	} else {
 		if ((host = gethostbyaddr(addr, len, type)) == NULL) {
@@ -921,10 +1137,18 @@
 {
 	HANDLE handle;
 	struct hostent *host;
+	int newpid;
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return 0;
+	}
 
 	handle = AllocWSAHandle();
 
-	if (fork()) {
+	newpid = fork();
+	if (newpid) {
+		dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
 		return handle;
 	} else {
 		if ((host = gethostbyname(name)) == NULL) {
@@ -948,10 +1172,18 @@
 {
 	HANDLE handle;
 	struct protoent *proto;
+	int newpid;
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return 0;
+	}
 
 	handle = AllocWSAHandle();
 
-	if (fork()) {
+	newpid = fork();
+	if (newpid) {
+		dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
 		return handle;
 	} else {
 		if ((proto = getprotobyname(name)) == NULL) {
@@ -975,10 +1207,18 @@
 {
 	HANDLE handle;
 	struct protoent *proto;
+	int newpid;
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return 0;
+	}
 
 	handle = AllocWSAHandle();
 
-	if (fork()) {
+	newpid = fork();
+	if (newpid) {
+		dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
 		return handle;
 	} else {
 		if ((proto = getprotobynumber(number)) == NULL) {
@@ -1002,10 +1242,18 @@
 {
 	HANDLE handle;
 	struct servent *service;
+	int newpid;
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return 0;
+	}
 
 	handle = AllocWSAHandle();
 
-	if (fork()) {
+	newpid = fork();
+	if (newpid) {
+		dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
 		return handle;
 	} else {
 		if ((service = getservbyname(name, proto)) == NULL) {
@@ -1029,10 +1277,18 @@
 {
 	HANDLE handle;
 	struct servent *service;
+	int newpid;
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return 0;
+	}
 
 	handle = AllocWSAHandle();
 
-	if (fork()) {
+	newpid = fork();
+	if (newpid) {
+		dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
 		return handle;
 	} else {
 		if ((service = getservbyport(port, proto)) == NULL) {
@@ -1055,8 +1311,14 @@
     long event;
     fd_set read_fds, write_fds, except_fds;
     int errors = 0;
+    int newpid;
 
-    dprintf_winsock(stddeb, "WSA_AsyncSelect: socket %d, HWND "NPFMT", wMsg %d, event %ld\n", s, hWnd, wMsg, lEvent);
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
+    dprintf_winsock(stddeb, "WSA_AsyncSelect: socket %d, HWND %04x, wMsg %d, event %ld\n", s, hWnd, wMsg, lEvent);
 
     /* remove outstanding asyncselect() processes */
     /* kill */
@@ -1064,7 +1326,9 @@
     if (wMsg == 0 && lEvent == 0) 
         return 0;
 
-    if (fork()) {
+    newpid = fork();
+    if (newpid) {
+        dprintf_winsock(stddeb, "forked, child is (%d)\n",newpid);
         return 0;
     } else {
         while (1) {
@@ -1099,7 +1363,12 @@
 
 INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
 {
-	dprintf_winsock(stddeb, "WSA_AsyncRequest: handle "NPFMT"\n", hAsyncTaskHandle);
+	dprintf_winsock(stddeb, "WSA_AsyncRequest: handle %04x\n", hAsyncTaskHandle);
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
 
 	return 0;
 }
@@ -1107,6 +1376,12 @@
 INT WSACancelBlockingCall(void)
 {
 	dprintf_winsock(stddeb, "WSA_CancelBlockCall\n");
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
+
 	return 0;
 }
           
@@ -1114,14 +1389,24 @@
 {
 	dprintf_winsock(stddeb, "WSA_GetLastError = %x\n", wsa_errno);
 
-    return wsa_errno;
+	return wsa_errno;
 }
 
 void WSASetLastError(INT iError)
 {
 	dprintf_winsock(stddeb, "WSA_SetLastErorr %d\n", iError);
 
-    wsa_errno = iError;
+	/* technically, we should make sure that WINESockets 
+	* has been started up correctly. But since this function
+	* is also used internally, it makes no sense.
+	*
+	*if (!wsa_initted) { 
+	*	WSASetLastError(WSANOTINITIALISED);
+	*	return SOCKET_ERROR;
+	*}
+	*/
+
+	wsa_errno = iError;
 }
 
 BOOL WSAIsBlocking(void)
@@ -1134,6 +1419,12 @@
 FARPROC WSASetBlockingHook(FARPROC lpBlockFunc)
 {
 	dprintf_winsock(stddeb, "WSA_SetBlockHook %8lx, STUB!\n", (unsigned long) lpBlockFunc);
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return NULL;
+	}
+
 	BlockFunction = lpBlockFunc;
 
 	return (FARPROC) lpBlockFunc;
@@ -1142,11 +1433,18 @@
 INT WSAUnhookBlockingHook(void)
 {
 	dprintf_winsock(stddeb, "WSA_UnhookBlockingHook\n");
+
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return NULL;
+	}
+
 	BlockFunction = NULL;
 
 	return 0;
 }
 
+#ifdef 0
 WSADATA WINSOCK_data = {
         0x0101,
         0x0101,
@@ -1162,14 +1460,35 @@
 #else
 	"Unknown",
 #endif
-        128,
-	1024,
+        WINSOCK_MAX_SOCKETS,
+	WINSOCK_MAX_UDPDG,
         NULL
 };
+#endif
 
 INT WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
 {
 
+	WSADATA WINSOCK_data = {
+        			0x0101,
+        			0x0101,
+        			"WINE Sockets",
+			#ifdef linux
+        			"Linux/i386",
+			#elif defined(__NetBSD__)
+        			"NetBSD/i386",
+			#elif defined(sunos)
+				"SunOS",
+			#elif defined(__FreeBSD__)
+				"FreeBSD",
+			#else
+				"Unknown",
+			#endif
+        			WINSOCK_MAX_SOCKETS,
+				WINSOCK_MAX_UDPDG,
+				NULL
+				};
+
     dprintf_winsock(stddeb, "WSAStartup: verReq=%x\n", wVersionRequested);
 
     if (LOBYTE(wVersionRequested) < 1 ||
@@ -1186,7 +1505,9 @@
 	return WSASYSNOTREADY;
 
     Heap = (struct WinSockHeap *) GlobalLock(HeapHandle);
-    memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data));
+
+    /* return winsock information */
+    memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data)); 
 
     /* ipc stuff */
 
@@ -1199,7 +1520,9 @@
     
     FD_ZERO(&fd_in_use);
 
-    wsa_initted = 1;
+    /* increment our usage count */
+    wsa_initted++;
+    dprintf_winsock(stddeb, "WSAStartup: succeeded\n");
     return(0);
 }
 
@@ -1207,14 +1530,25 @@
 {
 	int fd;
 
-	if (wine_key)
-		if (msgctl(wine_key, IPC_RMID, NULL) == -1)
-			perror("wine: winsock: shmctl");
+	dprintf_winsock(stddeb, "WSACleanup (%d)\n",getpid());
 
-	for (fd = 0; fd != FD_SETSIZE; fd++)
-		if (FD_ISSET(fd, &fd_in_use))
-			close(fd);
+	if (!wsa_initted) { 
+		WSASetLastError(WSANOTINITIALISED);
+		return SOCKET_ERROR;
+	}
 
-	wsa_initted = 0;
+	/* decrement usage count */
+	wsa_initted--;
+
+	if (wsa_initted == 0) {
+		if (wine_key)
+			if (msgctl(wine_key, IPC_RMID, NULL) == -1)
+				perror("wine: winsock: msgctl");
+
+		for (fd = 0; fd != FD_SETSIZE; fd++)
+			if (FD_ISSET(fd, &fd_in_use))
+				close(fd);
+
+	}
 	return 0;
 }
diff --git a/miscemu/interrupts.c b/miscemu/interrupts.c
index 97a9490..8e492c7 100644
--- a/miscemu/interrupts.c
+++ b/miscemu/interrupts.c
@@ -4,6 +4,8 @@
  * Copyright 1995 Alexandre Julliard
  */
 
+#include <sys/types.h>
+
 #include "windows.h"
 #include "drive.h"
 #include "miscemu.h"
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index c896070..de0fb0e 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -24,6 +24,12 @@
 #include "debug.h"
 #include "xmalloc.h"
 
+#ifdef WINELIB32
+#define UIFMT "%u"
+#else
+#define UIFMT "%hu"
+#endif
+
 extern MCI_OPEN_DRIVER_PARMS	mciDrv[MAXMCIDRIVERS];
 
 /* FIXME: I need to remember the aliasname of a spec. driver. 
diff --git a/objects/bitblt.c b/objects/bitblt.c
index 73159f3..b9b2b78 100644
--- a/objects/bitblt.c
+++ b/objects/bitblt.c
@@ -1066,11 +1066,11 @@
                                       dcSrc, xSrc, ySrc, widthSrc, heightSrc,
                                       &visRectSrc, &visRectDst ))
             return TRUE;
-        dprintf_bitblt( stddeb, "    vissrc=%ld,%ld-%ld,%ld visdst=%ld,%ld-%ld,%ld\n",
-                        (LONG)visRectSrc.left, (LONG)visRectSrc.top,
-                        (LONG)visRectSrc.right, (LONG)visRectSrc.bottom,
-                        (LONG)visRectDst.left, (LONG)visRectDst.top,
-                        (LONG)visRectDst.right, (LONG)visRectDst.bottom );
+        dprintf_bitblt( stddeb, "    vissrc=%d,%d-%d,%d visdst=%d,%d-%d,%d\n",
+                        visRectSrc.left, visRectSrc.top,
+                        visRectSrc.right, visRectSrc.bottom,
+                        visRectDst.left, visRectDst.top,
+                        visRectDst.right, visRectDst.bottom );
     }
     else
     {
@@ -1078,9 +1078,9 @@
         if (!BITBLT_GetVisRectangles( dcDst, xDst, yDst, widthDst, heightDst,
                                       NULL, 0, 0, 0, 0, NULL, &visRectDst ))
             return TRUE;
-        dprintf_bitblt( stddeb, "    vissrc=none visdst=%ld,%ld-%ld,%ld\n",
-                        (LONG)visRectDst.left, (LONG)visRectDst.top,
-                        (LONG)visRectDst.right, (LONG)visRectDst.bottom );
+        dprintf_bitblt( stddeb, "    vissrc=none visdst=%d,%d-%d,%d\n",
+                        visRectDst.left, visRectDst.top,
+                        visRectDst.right, visRectDst.bottom );
     }
 
     width  = visRectDst.right - visRectDst.left;
@@ -1239,8 +1239,8 @@
 	return TRUE;
     }
 
-    dprintf_bitblt(stddeb, "PatBlt: "NPFMT" %d,%d %dx%d %06lx\n",
-	    hdc, left, top, width, height, rop );
+    dprintf_bitblt(stddeb, "PatBlt: %04x %d,%d %dx%d %06lx\n",
+                   hdc, left, top, width, height, rop );
 
     return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
                                  dc, left, top, width, height,
@@ -1266,7 +1266,7 @@
     dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
 
     dprintf_bitblt(stddeb,
-                "BitBlt: "NPFMT" %d,%d %d bpp -> "NPFMT" %d,%d %dx%dx%d rop=%06lx\n",
+                "BitBlt: %04x %d,%d %d bpp -> %04x %d,%d %dx%dx%d rop=%06lx\n",
                 hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
                 hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
 
@@ -1296,7 +1296,7 @@
 
     dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC );
     dprintf_bitblt(stddeb,
-          "StretchBlt: "NPFMT" %d,%d %dx%dx%d -> "NPFMT" %d,%d %dx%dx%d rop=%06lx\n",
+          "StretchBlt: %04x %d,%d %dx%dx%d -> %04x %d,%d %dx%dx%d rop=%06lx\n",
                    hdcSrc, xSrc, ySrc, widthSrc, heightSrc,
                    dcSrc ? dcSrc->w.bitsPerPixel : 0, hdcDst, xDst, yDst,
                    widthDst, heightDst, dcDst->w.bitsPerPixel, rop );
diff --git a/objects/bitmap.c b/objects/bitmap.c
index d534d5d..b992124 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -123,7 +123,7 @@
 HBITMAP CreateCompatibleBitmap( HDC hdc, INT width, INT height )
 {
     DC * dc;
-    dprintf_gdi(stddeb, "CreateCompatibleBitmap: "NPFMT" %dx%d\n", 
+    dprintf_gdi(stddeb, "CreateCompatibleBitmap: %04x %dx%d\n", 
 		hdc, width, height );
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     return CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL );
@@ -225,11 +225,11 @@
     if (HIWORD(name))
     {
         char *str = (char *)PTR_SEG_TO_LIN( name );
-        dprintf_bitmap( stddeb, "LoadBitmap("NPFMT",'%s')\n", instance, str );
+        dprintf_bitmap( stddeb, "LoadBitmap(%04x,'%s')\n", instance, str );
         if (str[0] == '#') name = (SEGPTR)(DWORD)(WORD)atoi( str + 1 );
     }
     else
-        dprintf_bitmap( stddeb, "LoadBitmap("NPFMT",%04x)\n",
+        dprintf_bitmap( stddeb, "LoadBitmap(%04x,%04x)\n",
                         instance, LOWORD(name) );
 
     if (!instance)  /* OEM bitmap */
@@ -311,7 +311,7 @@
  */
 HBITMAP CreateDiscardableBitmap(HDC hdc, INT width, INT height)
 {
-    dprintf_bitmap(stddeb,"CreateDiscardableBitmap("NPFMT", %d, %d); "
+    dprintf_bitmap(stddeb,"CreateDiscardableBitmap(%04x, %d, %d); "
 	   "// call CreateCompatibleBitmap() for now!\n",
 	   hdc, width, height);
     return CreateCompatibleBitmap(hdc, width, height);
diff --git a/objects/brush.c b/objects/brush.c
index 0bca76d..cd55bd3 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -172,17 +172,13 @@
     LOGBRUSH logbrush = { BS_PATTERN, 0, 0 };
     BITMAPOBJ *bmp, *newbmp;
 
-    dprintf_gdi(stddeb, "CreatePatternBrush: "NPFMT"\n", hbitmap );
+    dprintf_gdi(stddeb, "CreatePatternBrush: %04x\n", hbitmap );
 
       /* Make a copy of the bitmap */
 
     if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
-#ifdef WINELIB32
-    logbrush.lbHatch = (LONG)CreateBitmapIndirect( &bmp->bitmap );
-#else
     logbrush.lbHatch = (INT)CreateBitmapIndirect( &bmp->bitmap );
-#endif
     newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HANDLE)logbrush.lbHatch, BITMAP_MAGIC );
     if (!newbmp) return 0;
     XCopyArea( display, bmp->pixmap, newbmp->pixmap, BITMAP_GC(bmp),
@@ -200,7 +196,7 @@
     BITMAPINFO *info, *newInfo;
     int size;
     
-    dprintf_gdi(stddeb, "CreateDIBPatternBrush: "NPFMT"\n", hbitmap );
+    dprintf_gdi(stddeb, "CreateDIBPatternBrush: %04x\n", hbitmap );
 
       /* Make a copy of the bitmap */
 
@@ -212,11 +208,7 @@
 	         * 8 * info->bmiHeader.biHeight;
     size += DIB_BitmapInfoSize( info, coloruse );
 
-#ifdef WINELIB32
-    if (!(logbrush.lbHatch = (LONG)GlobalAlloc( GMEM_MOVEABLE, size )))
-#else
     if (!(logbrush.lbHatch = (INT)GlobalAlloc( GMEM_MOVEABLE, size )))
-#endif
     {
 	GlobalUnlock( hbitmap );
 	return 0;
@@ -348,8 +340,8 @@
     BITMAPINFO * bmpInfo;
     HBRUSH prevHandle = dc->w.hBrush;
 
-    dprintf_gdi(stddeb, "Brush_SelectObject   hdc="NPFMT"  hbrush="NPFMT"\n",
-		hdc,hbrush);
+    dprintf_gdi(stddeb, "Brush_SelectObject: hdc=%04x hbrush=%04x\n",
+                hdc,hbrush);
     if (dc->header.wMagic == METAFILE_DC_MAGIC)
     {
 	switch (brush->logbrush.lbStyle)
diff --git a/objects/clipping.c b/objects/clipping.c
index 08e65d7..fc96017 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -67,7 +67,7 @@
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;
 
-    dprintf_clipping(stddeb, "SelectClipRgn: "NPFMT" "NPFMT"\n", hdc, hrgn );
+    dprintf_clipping(stddeb, "SelectClipRgn: %04x %04x\n", hdc, hrgn );
 
     if (hrgn)
     {
@@ -94,7 +94,7 @@
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc || !hrgn) return ERROR;
 
-    dprintf_clipping(stddeb, "SelectVisRgn: "NPFMT" "NPFMT"\n", hdc, hrgn );
+    dprintf_clipping(stddeb, "SelectVisRgn: %04x %04x\n", hdc, hrgn );
 
     retval = CombineRgn( dc->w.hVisRgn, hrgn, 0, RGN_COPY );
     CLIPPING_UpdateGCRegion( dc );
@@ -116,7 +116,7 @@
 	return NULLREGION;   /* ?? */
     }
 
-    dprintf_clipping(stddeb, "OffsetClipRgn: "NPFMT" %d,%d\n", hdc, x, y );
+    dprintf_clipping(stddeb, "OffsetClipRgn: %04x %d,%d\n", hdc, x, y );
 
     if (dc->w.hClipRgn)
     {
@@ -136,7 +136,7 @@
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "OffsetVisRgn: "NPFMT" %d,%d\n", hdc, x, y );
+    dprintf_clipping(stddeb, "OffsetVisRgn: %04x %d,%d\n", hdc, x, y );
     retval = OffsetRgn( dc->w.hVisRgn, x, y );
     CLIPPING_UpdateGCRegion( dc );
     return retval;
@@ -195,7 +195,7 @@
 	return NULLREGION;   /* ?? */
     }
 
-    dprintf_clipping(stddeb, "ExcludeClipRect: "NPFMT" %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "ExcludeClipRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, TRUE );
 }
@@ -216,7 +216,7 @@
 	return NULLREGION;   /* ?? */
     }
 
-    dprintf_clipping(stddeb, "IntersectClipRect: "NPFMT" %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "IntersectClipRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectClipRect( dc, left, top, right, bottom, FALSE );
 }
@@ -269,7 +269,7 @@
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "ExcludeVisRect: "NPFMT" %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "ExcludeVisRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, TRUE );
 }
@@ -283,7 +283,7 @@
 {
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "IntersectVisRect: "NPFMT" %dx%d,%dx%d\n",
+    dprintf_clipping(stddeb, "IntersectVisRect: %04x %dx%d,%dx%d\n",
 	    hdc, left, top, right, bottom );
     return CLIPPING_IntersectVisRect( dc, left, top, right, bottom, FALSE );
 }
@@ -297,7 +297,7 @@
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
 
-    dprintf_clipping(stddeb, "PtVisible: "NPFMT" %d,%d\n", hdc, x, y );
+    dprintf_clipping(stddeb, "PtVisible: %04x %d,%d\n", hdc, x, y );
     if (!dc->w.hGCClipRgn) return FALSE;
     return PtInRegion( dc->w.hGCClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
 }
@@ -311,9 +311,8 @@
     RECT tmpRect;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
-    dprintf_clipping(stddeb,"RectVisible: "NPFMT" %ld,%ldx%ld,%ld\n",
-                     hdc, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right,
-		     (LONG)rect->bottom );
+    dprintf_clipping(stddeb,"RectVisible: %04x %d,%dx%d,%d\n",
+                     hdc, rect->left, rect->top, rect->right, rect->bottom );
     if (!dc->w.hGCClipRgn) return FALSE;
     /* copy rectangle to avoid overwriting by LPtoDP */
     tmpRect = *rect;
@@ -330,7 +329,7 @@
     int ret;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return ERROR;    
-    dprintf_clipping(stddeb, "GetClipBox: "NPFMT" %p\n", hdc, rect );
+    dprintf_clipping(stddeb, "GetClipBox: %04x %p\n", hdc, rect );
     ret = GetRgnBox( dc->w.hGCClipRgn, rect );
     DPtoLP( hdc, (LPPOINT)rect, 2 );
     return ret;
@@ -346,7 +345,7 @@
     RGNOBJ *obj, *copyObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
-    dprintf_clipping(stddeb, "SaveVisRgn: "NPFMT"\n", hdc );
+    dprintf_clipping(stddeb, "SaveVisRgn: %04x\n", hdc );
     if (!dc->w.hVisRgn)
     {
         fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
@@ -373,7 +372,7 @@
     RGNOBJ *obj, *savedObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc || !dc->w.hVisRgn) return ERROR;    
-    dprintf_clipping(stddeb, "RestoreVisRgn: "NPFMT"\n", hdc );
+    dprintf_clipping(stddeb, "RestoreVisRgn: %04x\n", hdc );
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
 	return ERROR;
     if (!(saved = obj->header.hNext)) return ERROR;
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 763f53c..870f0ef 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -340,7 +340,7 @@
     }
 
     /* Make it owned by the module */
-    if (hInstance) FarSetOwner( handle, (WORD)(DWORD)GetExePtr(hInstance) );
+    if (hInstance) FarSetOwner( handle, GetExePtr(hInstance) );
 
     info = (CURSORICONINFO *)GlobalLock( handle );
     info->ptHotSpot.x   = hotspot.x;
@@ -417,7 +417,7 @@
     if (!(hInstance = GetExePtr( hInstance ))) return 0;
     size = GlobalSize( handle );
     hNew = GlobalAlloc( GMEM_MOVEABLE, size );
-    FarSetOwner( hNew, (WORD)(DWORD)hInstance );
+    FarSetOwner( hNew, hInstance );
     ptrNew = (char *)GlobalLock( hNew );
     memcpy( ptrNew, ptrOld, size );
     GlobalUnlock( handle );
@@ -466,10 +466,10 @@
 HCURSOR LoadCursor( HANDLE hInstance, SEGPTR name )
 {
     if (HIWORD(name))
-        dprintf_cursor( stddeb, "LoadCursor: "NPFMT" '%s'\n",
+        dprintf_cursor( stddeb, "LoadCursor: %04x '%s'\n",
                         hInstance, (char *)PTR_SEG_TO_LIN( name ) );
     else
-        dprintf_cursor( stddeb, "LoadCursor: "NPFMT" %04x\n",
+        dprintf_cursor( stddeb, "LoadCursor: %04x %04x\n",
                         hInstance, LOWORD(name) );
 
     return CURSORICON_Load( hInstance, name,
@@ -483,10 +483,10 @@
 HICON LoadIcon( HANDLE hInstance, SEGPTR name )
 {
     if (HIWORD(name))
-        dprintf_icon( stddeb, "LoadIcon: "NPFMT" '%s'\n",
+        dprintf_icon( stddeb, "LoadIcon: %04x '%s'\n",
                       hInstance, (char *)PTR_SEG_TO_LIN( name ) );
     else
-        dprintf_icon( stddeb, "LoadIcon: "NPFMT" %04x\n",
+        dprintf_icon( stddeb, "LoadIcon: %04x %04x\n",
                       hInstance, LOWORD(name) );
 
     return CURSORICON_Load( hInstance, name,
@@ -554,16 +554,16 @@
 /***********************************************************************
  *           CopyIcon    (USER.368)
  */
-#ifdef WINELIB32
+#ifdef WINELIB
 HICON CopyIcon( HICON hIcon )
 {
-    dprintf_icon( stddeb, "CopyIcon: "NPFMT"\n", hIcon );
+    dprintf_icon( stddeb, "CopyIcon: %04x\n", hIcon );
     return CURSORICON_Copy( 0, hIcon );
 }
 #else
 HICON CopyIcon( HANDLE hInstance, HICON hIcon )
 {
-    dprintf_icon( stddeb, "CopyIcon: "NPFMT" "NPFMT"\n", hInstance, hIcon );
+    dprintf_icon( stddeb, "CopyIcon: %04x %04x\n", hInstance, hIcon );
     return CURSORICON_Copy( hInstance, hIcon );
 }
 #endif
@@ -572,16 +572,16 @@
 /***********************************************************************
  *           CopyCursor    (USER.369)
  */
-#ifdef WINELIB32
+#ifdef WINELIB
 HCURSOR CopyCursor( HCURSOR hCursor )
 {
-    dprintf_cursor( stddeb, "CopyCursor: "NPFMT"\n", hCursor );
+    dprintf_cursor( stddeb, "CopyCursor: %04x\n", hCursor );
     return CURSORICON_Copy( 0, hCursor );
 }
 #else
 HCURSOR CopyCursor( HANDLE hInstance, HCURSOR hCursor )
 {
-    dprintf_cursor( stddeb, "CopyCursor: "NPFMT" "NPFMT"\n", hInstance, hCursor );
+    dprintf_cursor( stddeb, "CopyCursor: %04x %04x\n", hInstance, hCursor );
     return CURSORICON_Copy( hInstance, hCursor );
 }
 #endif
@@ -592,7 +592,7 @@
  */
 BOOL DestroyIcon( HICON hIcon )
 {
-    dprintf_icon( stddeb, "DestroyIcon: "NPFMT"\n", hIcon );
+    dprintf_icon( stddeb, "DestroyIcon: %04x\n", hIcon );
     /* FIXME: should check for OEM icon here */
     return (GlobalFree( hIcon ) != 0);
 }
@@ -603,7 +603,7 @@
  */
 BOOL DestroyCursor( HCURSOR hCursor )
 {
-    dprintf_cursor( stddeb, "DestroyCursor: "NPFMT"\n", hCursor );
+    dprintf_cursor( stddeb, "DestroyCursor: %04x\n", hCursor );
     /* FIXME: should check for OEM cursor here */
     return (GlobalFree( hCursor ) != 0);
 }
@@ -697,7 +697,7 @@
         if (!(ptr = (CURSORICONINFO*)GlobalLock( hCursor ))) return FALSE;
         if (ptr->bPlanes * ptr->bBitsPerPixel != 1)
         {
-            fprintf( stderr, "Cursor "NPFMT" has more than 1 bpp!\n", hCursor );
+            fprintf( stderr, "Cursor %04x has more than 1 bpp!\n", hCursor );
             return FALSE;
         }
 
@@ -813,7 +813,7 @@
     HCURSOR hOldCursor;
 
     if (hCursor == hActiveCursor) return hActiveCursor;  /* No change */
-    dprintf_cursor( stddeb, "SetCursor: "NPFMT"\n", hCursor );
+    dprintf_cursor( stddeb, "SetCursor: %04x\n", hCursor );
     hOldCursor = hActiveCursor;
     hActiveCursor = hCursor;
     /* Change the cursor shape only if it is visible */
@@ -892,8 +892,7 @@
 	pt->x = rootX + desktopX;
 	pt->y = rootY + desktopY;
     }
-    dprintf_cursor(stddeb, "GetCursorPos: ret=%ld,%ld\n", (LONG)pt->x, 
-		   (LONG)pt->y );
+    dprintf_cursor(stddeb, "GetCursorPos: ret=%d,%d\n", pt->x, pt->y );
 }
 
 
@@ -920,7 +919,7 @@
         return 0;
     }
 
-    dprintf_cursor( stddeb, "GetIconID: hRes="NPFMT", entries=%i\n",
+    dprintf_cursor( stddeb, "GetIconID: hRes=%04x, entries=%i\n",
                     hResource, lpDir->idCount );
 
     switch(resType)
@@ -949,7 +948,7 @@
  */
 HICON LoadIconHandler( HANDLE hResource, BOOL bNew )
 {
-    dprintf_cursor(stddeb,"LoadIconHandler: hRes="NPFMT"\n",hResource);
+    dprintf_cursor(stddeb,"LoadIconHandler: hRes=%04x\n",hResource);
 
     if( !bNew )
       {
diff --git a/objects/dc.c b/objects/dc.c
index 029534c..6c7a5dc 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -333,7 +333,7 @@
     if (!(handle = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return 0;
     newdc = (DC *) GDI_HEAP_LIN_ADDR( handle );
 
-    dprintf_dc(stddeb, "GetDCState("NPFMT"): returning "NPFMT"\n", hdc, handle );
+    dprintf_dc(stddeb, "GetDCState(%04x): returning %04x\n", hdc, handle );
 
     memset( &newdc->u.x, 0, sizeof(newdc->u.x) );
     memcpy( &newdc->w, &dc->w, sizeof(dc->w) );
@@ -366,7 +366,7 @@
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
     if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return;
     if (!dcs->w.flags & DC_SAVED) return;
-    dprintf_dc(stddeb, "SetDCState: "NPFMT" "NPFMT"\n", hdc, hdcs );
+    dprintf_dc(stddeb, "SetDCState: %04x %04x\n", hdc, hdcs );
 
       /* Save the regions before overwriting everything */
     hVisRgn    = dc->w.hVisRgn;
@@ -410,7 +410,7 @@
     dcs = (DC *) GDI_HEAP_LIN_ADDR( hdcs );
     dcs->header.hNext = dc->header.hNext;
     dc->header.hNext = hdcs;
-    dprintf_dc(stddeb, "SaveDC("NPFMT"): returning %d\n", hdc, dc->saveLevel+1 );
+    dprintf_dc(stddeb, "SaveDC(%04x): returning %d\n", hdc, dc->saveLevel+1 );
     return ++dc->saveLevel;
 }
 
@@ -422,7 +422,7 @@
 {
     DC * dc, * dcs;
 
-    dprintf_dc(stddeb, "RestoreDC: "NPFMT" %d\n", hdc, level );
+    dprintf_dc(stddeb, "RestoreDC: %04x %d\n", hdc, level );
     dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
     {
@@ -459,7 +459,7 @@
     if (!handle) return 0;
     dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
 
-    dprintf_dc(stddeb, "CreateDC(%s %s %s): returning "NPFMT"\n",
+    dprintf_dc(stddeb, "CreateDC(%s %s %s): returning %04x\n",
 	    driver, device, output, handle );
 
     if (!displayDevCaps)
@@ -515,7 +515,7 @@
     if (!handle) return 0;
     dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
 
-    dprintf_dc(stddeb, "CreateCompatibleDC("NPFMT"): returning "NPFMT"\n", hdc, handle );
+    dprintf_dc(stddeb, "CreateCompatibleDC(%04x): returning %04x\n", hdc, handle );
 
       /* Create default bitmap */
     if (!(hbitmap = CreateBitmap( 1, 1, 1, 1, NULL )))
@@ -559,7 +559,7 @@
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return FALSE;
 
-    dprintf_dc(stddeb, "DeleteDC: "NPFMT"\n", hdc );
+    dprintf_dc(stddeb, "DeleteDC: %04x\n", hdc );
 
     while (dc->saveLevel)
     {
@@ -608,7 +608,7 @@
 
     if (cap > sizeof(DeviceCaps)-sizeof(WORD)) return 0;
     
-    dprintf_dc(stddeb, "GetDeviceCaps("NPFMT",%d): returning %d\n",
+    dprintf_dc(stddeb, "GetDeviceCaps(%04x,%d): returning %d\n",
 	    hdc, cap, *(WORD *)(((char *)dc->w.devCaps) + cap) );
     return *(WORD *)(((char *)dc->w.devCaps) + cap);
 }
diff --git a/objects/font.c b/objects/font.c
index bbef8f6..114c8ea 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -283,7 +283,7 @@
 DWORD GetGlyphOutLine(HDC hdc, UINT uChar, UINT fuFormat, LPGLYPHMETRICS lpgm, 
                       DWORD cbBuffer, LPSTR lpBuffer, LPMAT2 lpmat2) 
 {
-    fprintf( stdnimp,"GetGlyphOutLine("NPFMT", '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
+    fprintf( stdnimp,"GetGlyphOutLine(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
              hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
     return (DWORD)-1; /* failure */
 }
@@ -323,7 +323,7 @@
     fontPtr = (FONTOBJ *) GDI_HEAP_LIN_ADDR( hfont );
     memcpy( &fontPtr->logfont, font, sizeof(LOGFONT) );
     AnsiLower( fontPtr->logfont.lfFaceName );
-    dprintf_font(stddeb,"CreateFontIndirect(%p (%d,%d)); return "NPFMT"\n",
+    dprintf_font(stddeb,"CreateFontIndirect(%p (%d,%d)); return %04x\n",
 	font, font->lfHeight, font->lfWidth, hfont);
     return hfont;
 }
@@ -370,8 +370,7 @@
     X_PHYSFONT * stockPtr;
     HFONT prevHandle = dc->w.hFont;
     XFontStruct * fontStruct;
-    dprintf_font(stddeb,"FONT_SelectObject(%p, "NPFMT", %p)\n", 
-		     dc, hfont, font);
+    dprintf_font(stddeb,"FONT_SelectObject(%p, %04x, %p)\n", dc, hfont, font);
 
 #if 0 /* From the code in SelectObject, this can not happen */
       /* Load font if necessary */
@@ -392,9 +391,8 @@
       else
 	return 0;
 
-      /*  Must be DWORD for WINELIB32 support  */
     if ((hfont >= FIRST_STOCK_FONT) && (hfont <= LAST_STOCK_FONT))
-	stockPtr = &stockFonts[(DWORD)hfont - (DWORD)FIRST_STOCK_FONT];
+	stockPtr = &stockFonts[hfont - FIRST_STOCK_FONT];
     else 
 	stockPtr = NULL;
     
@@ -405,7 +403,7 @@
               /* If it is not a stock font, we can simply return 0 */
             if (!stockPtr) return 0;
               /* Otherwise we must try to find a substitute */
-            dprintf_font(stddeb,"Loading font 'fixed' for "NPFMT"\n", hfont );
+            dprintf_font(stddeb,"Loading font 'fixed' for %04x\n", hfont );
             font->logfont.lfPitchAndFamily &= ~VARIABLE_PITCH;
             font->logfont.lfPitchAndFamily |= FIXED_PITCH;
             fontStruct = XLoadQueryFont( display, "fixed" );
@@ -420,7 +418,7 @@
     {
 	fontStruct = stockPtr->fstruct;
 	dprintf_font(stddeb,
-                     "FONT_SelectObject: Loaded font from cache "NPFMT" %p\n",
+                     "FONT_SelectObject: Loaded font from cache %04x %p\n",
 		     hfont, fontStruct );
     }	
 
@@ -550,9 +548,8 @@
     size->cy = abs((dc->u.x.font.fstruct->ascent+dc->u.x.font.fstruct->descent)
 		    * dc->w.WndExtY / dc->w.VportExtY);
 
-    dprintf_font(stddeb,"GetTextExtentPoint("NPFMT" '%*.*s' %d %p): returning %ld,%ld\n",
-		 hdc, count, count, str, count, size, (LONG)size->cx, 
-		 (LONG)size->cy );
+    dprintf_font(stddeb,"GetTextExtentPoint(%04x '%*.*s' %d %p): returning %d,%d\n",
+		 hdc, count, count, str, count, size, size->cx, size->cy );
     return TRUE;
 }
 
@@ -588,7 +585,7 @@
  */
 DWORD SetMapperFlags(HDC hDC, DWORD dwFlag)
 {
-    dprintf_font(stdnimp,"SetmapperFlags("NPFMT", %08lX) // Empty Stub !\n", 
+    dprintf_font(stdnimp,"SetmapperFlags(%04x, %08lX) // Empty Stub !\n", 
 		 hDC, dwFlag); 
     return 0L;
 }
@@ -664,10 +661,6 @@
 int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz)
 {
 	int 	i;
-#if 0
-	dprintf_font(stddeb,"ParseFontParms('%s', %d, %p, %d);\n", 
-			lpFont, wParmsNo, lpRetStr, wMaxSiz);
-#endif
 	if (lpFont == NULL) return 0;
 	if (lpRetStr == NULL) return 0;
 	for (i = 0; (*lpFont != '\0' && i != wParmsNo); ) {
@@ -680,9 +673,6 @@
 		for (i = 0; (*lpFont != '\0' && *lpFont != '-' && i < wMaxSiz); i++)
 			*(lpRetStr + i) = *lpFont++;
 		*(lpRetStr + i) = '\0';
-#if 0
-		dprintf_font(stddeb,"ParseFontParms // '%s'\n", lpRetStr);
-#endif
 		return i;
 		}
 	else
@@ -789,7 +779,7 @@
   int          nRet = 0;
   int          i;
   
-  dprintf_font(stddeb,"EnumFonts("NPFMT", %p='%s', %08lx, %08lx)\n", 
+  dprintf_font(stddeb,"EnumFonts(%04x, %p='%s', %08lx, %08lx)\n", 
 	       hDC, lpFaceName, lpFaceName, (LONG)lpEnumFunc, lpData);
   if (lpEnumFunc == 0) return 0;
   hLog = GDI_HEAP_ALLOC( sizeof(LOGFONT) + LF_FACESIZE );
@@ -859,7 +849,7 @@
   int	       	nRet = 0;
   int	       	i;
   
-  dprintf_font(stddeb,"EnumFontFamilies("NPFMT", %p, %08lx, %08lx)\n",
+  dprintf_font(stddeb,"EnumFontFamilies(%04x, %p, %08lx, %08lx)\n",
 	       hDC, lpszFamily, (DWORD)lpEnumFunc, lpData);
   if (lpEnumFunc == 0) return 0;
   hLog = GDI_HEAP_ALLOC( sizeof(ENUMLOGFONT) );
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index d840c1e..ad3ef50 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -174,7 +174,7 @@
       /* Create default palette */
 
     if (!(hpalette = COLOR_Init())) return FALSE;
-    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( hpalette );
+    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hpalette );
 
       /* Create default bitmap */
 
@@ -217,8 +217,8 @@
     GDIOBJHDR * object;
 
       /* Can't free stock objects */
-    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
-	(DWORD)handle <= LAST_STOCK_HANDLE   ) return TRUE;
+    if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
+        return TRUE;
     
     object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!object) return FALSE;
@@ -240,9 +240,8 @@
 {
     GDIOBJHDR * ptr = NULL;
 
-    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
-	(DWORD)handle <= LAST_STOCK_HANDLE   )
-      ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE];
+    if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
+      ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else 
       ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!ptr) return NULL;
@@ -261,7 +260,7 @@
     GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
     if (!header) return FALSE;
 
-    dprintf_gdi(stddeb, "DeleteObject: "NPFMT"\n", obj );
+    dprintf_gdi(stddeb, "DeleteObject: %04x\n", obj );
 
       /* Delete object */
 
@@ -285,9 +284,9 @@
 {
     if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
     if (!StockObjects[obj]) return 0;
-    dprintf_gdi(stddeb, "GetStockObject: returning %ld\n",
-		(DWORD)FIRST_STOCK_HANDLE + obj );
-    return (HANDLE)((DWORD)FIRST_STOCK_HANDLE + obj);
+    dprintf_gdi(stddeb, "GetStockObject: returning %d\n",
+                FIRST_STOCK_HANDLE + obj );
+    return (HANDLE)(FIRST_STOCK_HANDLE + obj);
 }
 
 
@@ -297,12 +296,11 @@
 int GetObject( HANDLE handle, int count, LPSTR buffer )
 {
     GDIOBJHDR * ptr = NULL;
-    dprintf_gdi(stddeb, "GetObject: "NPFMT" %d %p\n", handle, count, buffer );
+    dprintf_gdi(stddeb, "GetObject: %04x %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
-    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
-	(DWORD)handle <= LAST_STOCK_HANDLE   )
-      ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE];
+    if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
+      ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else
       ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!ptr) return 0;
@@ -332,10 +330,9 @@
     GDIOBJHDR * ptr = NULL;
     DC * dc;
     
-    dprintf_gdi(stddeb, "SelectObject: "NPFMT" "NPFMT"\n", hdc, handle );
-    if ((DWORD)handle >= FIRST_STOCK_HANDLE &&
-	(DWORD)handle <= LAST_STOCK_HANDLE   )
-      ptr = StockObjects[(DWORD)handle - FIRST_STOCK_HANDLE];
+    dprintf_gdi(stddeb, "SelectObject: %04x %04x\n", hdc, handle );
+    if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
+      ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else 
       ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (!ptr) return 0;
@@ -369,7 +366,7 @@
  */
 BOOL UnrealizeObject( HANDLE handle )
 {
-    dprintf_gdi(stdnimp, "UnrealizeObject: "NPFMT"\n", handle );
+    dprintf_gdi(stdnimp, "UnrealizeObject: %04x\n", handle );
     return TRUE;
 }
 
@@ -393,7 +390,7 @@
     
     int i, retval = 0;
 
-    dprintf_gdi( stddeb, "EnumObjects: "NPFMT" %d %08lx %08lx\n",
+    dprintf_gdi( stddeb, "EnumObjects: %04x %d %08lx %08lx\n",
                  hdc, nObjType, (DWORD)lpEnumFunc, lParam );
     switch(nObjType)
     {
@@ -440,122 +437,17 @@
         break;
     }
     return retval;
-#if 0
-
-  /*    HANDLE 		handle;
-   DC 			*dc;*/
-  HANDLE       	*lphObj;
-  GDIOBJHDR 	*header;
-  WORD         	wMagic;
-  LPSTR		lpLog;  	/* Point to a LOGBRUSH or LOGPEN struct */
-  HANDLE       	hLog;
-  int	       	nRet = 0;
-  
-  if (lpEnumFunc == 0) {
-    fprintf(stderr,"EnumObjects // Bad EnumProc callback address !\n");
-    return 0;
-  }
-  switch (nObjType) {
-   case OBJ_PEN:
-    wMagic = PEN_MAGIC;
-    dprintf_gdi(stddeb,"EnumObjects("NPFMT", OBJ_PEN, %08lx, %p);\n",
-		hDC, (LONG)lpEnumFunc, lpData);
-    hLog = GDI_HEAP_ALLOC( sizeof(LOGPEN) );
-    lpLog = (LPSTR) GDI_HEAP_LIN_ADDR(hLog);
-    if (lpLog == NULL) {
-      fprintf(stderr,"EnumObjects // Unable to alloc LOGPEN struct !\n");
-      return 0;
-    }
-    break;
-   case OBJ_BRUSH:
-    wMagic = BRUSH_MAGIC;
-    dprintf_gdi(stddeb,"EnumObjects("NPFMT", OBJ_BRUSH, %08lx, %p);\n",
-		hDC, (LONG)lpEnumFunc, lpData);
-    hLog = GDI_HEAP_ALLOC( sizeof(LOGBRUSH) );
-    lpLog = (LPSTR) GDI_HEAP_LIN_ADDR(hLog);
-    if (lpLog == NULL) {
-      fprintf(stderr,"EnumObjects // Unable to alloc LOGBRUSH struct !\n");
-      return 0;
-    }
-    break;
-   default:
-    fprintf(stderr,"EnumObjects("NPFMT", %04X, %08lx, %p); // Unknown OBJ type !\n", 
-	    hDC, nObjType, (LONG)lpEnumFunc, lpData);
-    return 0;
-  }
-#ifdef notdef  /* FIXME: stock object ptr won't work in callback */
-  dprintf_gdi(stddeb,"EnumObjects // Stock Objects first !\n");
-  for (i = 0; i < NB_STOCK_OBJECTS; i++) {
-    header = StockObjects[i];
-    if (header->wMagic == wMagic) {
-      PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), lpLog);
-      BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH),lpLog);
-      dprintf_gdi(stddeb,"EnumObjects // StockObj lpLog=%p lpData=%p\n", lpLog, lpData);
-      if (header->wMagic == BRUSH_MAGIC) {
-	dprintf_gdi(stddeb,"EnumObjects // StockBrush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle);
-	dprintf_gdi(stddeb,"EnumObjects // StockBrush lbColor=%08lX\n", ((LPLOGBRUSH)lpLog)->lbColor);
-	dprintf_gdi(stddeb,"EnumObjects // StockBrush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch);
-      }
-      if (header->wMagic == PEN_MAGIC) {
-	dprintf_gdi(stddeb,"EnumObjects // StockPen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle);
-	dprintf_gdi(stddeb,"EnumObjects // StockPen lopnWidth=%d\n", ((LPLOGPEN)lpLog)->lopnWidth.x);
-	dprintf_gdi(stddeb,"EnumObjects // StockPen lopnColor=%08lX\n", ((LPLOGPEN)lpLog)->lopnColor);
-      }
-      nRet = CallEnumObjectsProc( lpEnumFunc,
-				 GDI_HEAP_SEG_ADDR(hLog),
-				 (int)lpData );
-      dprintf_gdi(stddeb,"EnumObjects // after Callback!\n");
-      if (nRet == 0) {
-	GDI_HEAP_FREE(hLog);
-	dprintf_gdi(stddeb,"EnumObjects // EnumEnd requested by application !\n");
-	return 0;
-      }
-    }
-  }
-  dprintf_gdi(stddeb,"EnumObjects // Now DC owned objects %p !\n", header);
-#endif  /* notdef */
-  
-  if (lpPenBrushList == NULL) return 0;
-  for (lphObj = lpPenBrushList; *lphObj != 0; ) {
-    dprintf_gdi(stddeb,"EnumObjects // *lphObj="NPFMT"\n", *lphObj);
-    header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR(*lphObj++);
-    if (header->wMagic == wMagic) {
-      dprintf_gdi(stddeb,"EnumObjects // DC_Obj lpLog=%p lpData=%p\n", lpLog, lpData);
-      if (header->wMagic == BRUSH_MAGIC) {
-	BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), lpLog);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbColor=%08lX\n", ((LPLOGBRUSH)lpLog)->lbColor);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Brush lbHatch=%04lX\n", (LONG)((LPLOGBRUSH)lpLog)->lbHatch);
-      }
-      if (header->wMagic == PEN_MAGIC) {
-	PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), lpLog);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnWidth=%ld\n", (LONG)((LPLOGPEN)lpLog)->lopnWidth.x);
-	dprintf_gdi(stddeb,"EnumObjects // DC_Pen lopnColor=%08lX\n", ((LPLOGPEN)lpLog)->lopnColor);
-      }
-      nRet = CallEnumObjectsProc(lpEnumFunc, GDI_HEAP_SEG_ADDR(hLog),
-				 (LONG)lpData);
-      if (nRet == 0)
-        break;
-    }
-  }
-  GDI_HEAP_FREE(hLog);
-  dprintf_gdi(stddeb,"EnumObjects // End of enumeration !\n");
-  return nRet;
-#endif
 }
 
 
 /***********************************************************************
- *		IsGDIObject(GDI.462)
+ *           IsGDIObject    (GDI.462)
  */
 BOOL IsGDIObject(HANDLE handle)
 {
-	GDIOBJHDR *object;
+    GDIOBJHDR *object;
 
-	object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
-	if (object)
-		return TRUE;
-	else
-		return FALSE;
+    object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    /* FIXME: should check magic here */
+    return (object != NULL);
 }
diff --git a/objects/linedda.c b/objects/linedda.c
index d53e133..a6b1296 100644
--- a/objects/linedda.c
+++ b/objects/linedda.c
@@ -3,8 +3,7 @@
  *
  * Copyright 1993 Bob Amstadt
  *
-static char Copyright[] = "Copyright  Bob Amstadt, 1993";
-*/
+ */
 
 #include <stdlib.h>
 #include "windows.h"
diff --git a/objects/metafile.c b/objects/metafile.c
index e93c1a7..f66465c 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -3,8 +3,7 @@
  *
  * Copyright  David W. Metcalfe, 1994
  *
-static char Copyright[] = "Copyright  David W. Metcalfe, 1994";
-*/
+ */
 
 #include <string.h>
 #include <fcntl.h>
@@ -573,7 +572,7 @@
     HANDLE hMem = mf->hMetaHdr;
     METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
 
-    dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: "NPFMT"\n", hmf);
+    dprintf_metafile(stddeb,"GetMetaFileBits: hmf in: %04x\n", hmf);
 
     /* can't get bits of disk based metafile */
     /* FIXME: should the disk file be loaded in this case? */
@@ -589,7 +588,7 @@
     GlobalUnlock(hMem);
     GlobalFree(hmf);
 
-    dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: "NPFMT"\n", hMem);
+    dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %04x\n", hMem);
 
     return hMem;
 }
@@ -605,7 +604,7 @@
     METAFILE *mf;
     METAHEADER *mh = (METAHEADER *)GlobalLock(hMem);
 
-    dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: "NPFMT"\n", hMem);
+    dprintf_metafile(stddeb,"SetMetaFileBits: hMem in: %04x\n", hMem);
 
     if (!mh) return FALSE;
 
@@ -629,7 +628,7 @@
     GlobalUnlock(hMem);
     GlobalUnlock(hmf);
 
-    dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: "NPFMT"\n", hmf);
+    dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %04x\n", hmf);
 
     return hmf;
 }
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index 0b2d9a5..63204cf 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -17,7 +17,7 @@
 #include "cursoricon.h"
 #include "stddebug.h"
 #include "debug.h"
-
+#include "xmalloc.h"
 
   /* Include OEM pixmaps */
 #include "bitmaps/obm_cdrom"
@@ -327,28 +327,34 @@
                                HBITMAP *hBitmapMask, POINT *hotspot )
 {
     Pixmap pixmap, pixmask;
-    XpmAttributes attrs;
+    XpmAttributes *attrs;
     int err;
 
-    attrs.valuemask    = XpmColormap | XpmDepth | XpmColorSymbols | XpmHotspot;
-    attrs.colormap     = COLOR_WinColormap;
-    attrs.depth        = color ? screenDepth : 1;
-    attrs.colorsymbols = (attrs.depth > 1) ? OBM_Colors : OBM_BlackAndWhite;
-    attrs.numsymbols   = (attrs.depth > 1) ? NB_COLOR_SYMBOLS : 2;
+    attrs = (XpmAttributes *)xmalloc( XpmAttributesSize() );
+    attrs->valuemask    = XpmColormap | XpmDepth | XpmColorSymbols |XpmHotspot;
+    attrs->colormap     = COLOR_WinColormap;
+    attrs->depth        = color ? screenDepth : 1;
+    attrs->colorsymbols = (attrs->depth > 1) ? OBM_Colors : OBM_BlackAndWhite;
+    attrs->numsymbols   = (attrs->depth > 1) ? NB_COLOR_SYMBOLS : 2;
         
     err = XpmCreatePixmapFromData( display, rootWindow, data,
-                                   &pixmap, &pixmask, &attrs );
+                                   &pixmap, &pixmask, attrs );
 
-    if (err != XpmSuccess) return FALSE;
+    if (err != XpmSuccess)
+    {
+        free( attrs );
+        return FALSE;
+    }
     if (hotspot)
     {
-        hotspot->x = attrs.x_hotspot;
-        hotspot->y = attrs.y_hotspot;
+        hotspot->x = attrs->x_hotspot;
+        hotspot->y = attrs->y_hotspot;
     }
-    *hBitmap = OBM_MakeBitmap( attrs.width, attrs.height,
-                               attrs.depth, pixmap );
-    if (hBitmapMask) *hBitmapMask = OBM_MakeBitmap( attrs.width, attrs.height,
-                                                    1, pixmask );
+    *hBitmap = OBM_MakeBitmap( attrs->width, attrs->height,
+                               attrs->depth, pixmap );
+    if (hBitmapMask) *hBitmapMask = OBM_MakeBitmap(attrs->width, attrs->height,
+                                                   1, pixmask );
+    free( attrs );
     if (!*hBitmap)
     {
         if (pixmap) XFreePixmap( display, pixmap );
diff --git a/objects/palette.c b/objects/palette.c
index a637d5a..25001e1 100644
--- a/objects/palette.c
+++ b/objects/palette.c
@@ -3,18 +3,11 @@
  *
  * Copyright 1993,1994 Alexandre Julliard
  *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993,1994";
-*/
+ */
 #include <stdlib.h>
 #include <string.h>
-#include <limits.h>
-
-#if !defined  (MAXINT)
-#include <limits.h>
-#define MAXINT INT_MAX
-#endif
-
 #include <X11/Xlib.h>
+
 #include "color.h"
 #include "palette.h"
 #include "stddebug.h"
@@ -51,7 +44,7 @@
     b = GetBValue(*color);
 
     entry = palPtr->logpalette.palPalEntry;
-    for (i = 0, minDist = MAXINT; minDist !=0 &&
+    for (i = 0, minDist = 0xffffff; minDist !=0 &&
          i < palPtr->logpalette.palNumEntries ; i++)
     {
 	if (entry->peFlags != 0xff)
@@ -158,7 +151,7 @@
 WORD SetSystemPaletteUse( HDC hdc, WORD use)
 {
 	 WORD old=SystemPaletteUse;
-	 printf("SetSystemPaletteUse("NPFMT",%04X) // empty stub !!!\n", hdc, use);
+	 printf("SetSystemPaletteUse(%04x,%04x) // empty stub !!!\n", hdc, use);
 	 SystemPaletteUse=use;
 	 return old;
 }
@@ -168,7 +161,7 @@
  */
 WORD GetSystemPaletteUse( HDC hdc )
 {
-	printf("GetSystemPaletteUse("NPFMT") // empty stub !!!\n", hdc);
+	printf("GetSystemPaletteUse(%04x) // empty stub !!!\n", hdc);
 	return SystemPaletteUse;
 }
 
@@ -206,7 +199,7 @@
 WORD GetNearestPaletteIndex( HPALETTE hpalette, COLORREF color )
 {
     WORD index = PALETTE_GetNearestIndexAndColor( hpalette, &color );
-    dprintf_palette(stddeb,"GetNearestPaletteIndex("NPFMT",%06lx): returning %d\n", 
+    dprintf_palette(stddeb,"GetNearestPaletteIndex(%04x,%06lx): returning %d\n", 
                     hpalette, color, index );
     return index;
 }
@@ -247,7 +240,7 @@
     HPALETTE prev;
     DC *dc;
 
-    dprintf_palette(stddeb, "GDISelectPalette: "NPFMT" "NPFMT"\n", hdc, hpal );
+    dprintf_palette(stddeb, "GDISelectPalette: %04x %04x\n", hdc, hpal );
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     prev = dc->w.hPalette;
     dc->w.hPalette = hpal;
@@ -262,7 +255,7 @@
  */
 UINT GDIRealizePalette( HDC hdc )
 {
-    dprintf_palette(stdnimp, "GDIRealizePalette: "NPFMT"\n", hdc );
+    dprintf_palette(stdnimp, "GDIRealizePalette: %04x\n", hdc );
     return 0;
 }
 
diff --git a/objects/region.c b/objects/region.c
index 7e7e290..f994a91 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -19,7 +19,7 @@
  */
 BOOL REGION_DeleteObject( HRGN hrgn, RGNOBJ * obj )
 {
-    dprintf_region(stddeb, "DeleteRegion: "NPFMT"\n", hrgn );
+    dprintf_region(stddeb, "DeleteRegion: %04x\n", hrgn );
     if (obj->xrgn) XDestroyRegion( obj->xrgn );
     return GDI_FreeObject( hrgn );
 }
@@ -32,7 +32,7 @@
 {
     RGNOBJ * obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC );
     if (!obj) return ERROR;
-    dprintf_region(stddeb, "OffsetRgn: "NPFMT" %d,%d\n", hrgn, x, y );
+    dprintf_region(stddeb, "OffsetRgn: %04x %d,%d\n", hrgn, x, y );
     if (!obj->xrgn) return NULLREGION;
     XOffsetRegion( obj->xrgn, x, y );
     return COMPLEXREGION;
@@ -46,7 +46,7 @@
 {
     RGNOBJ * obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC );
     if (!obj) return ERROR;
-    dprintf_region(stddeb, "GetRgnBox: "NPFMT"\n", hrgn );
+    dprintf_region(stddeb, "GetRgnBox: %04x\n", hrgn );
     if (!obj->xrgn)
     {
         SetRectEmpty( rect );
@@ -84,7 +84,7 @@
         XUnionRectWithRegion( &rect, obj->xrgn, obj->xrgn );
     }
     else obj->xrgn = 0;
-    dprintf_region( stddeb, "CreateRectRgn(%d,%d-%d,%d): returning "NPFMT"\n",
+    dprintf_region( stddeb, "CreateRectRgn(%d,%d-%d,%d): returning %04x\n",
                     left, top, right, bottom, hrgn );
     return hrgn;
 }
@@ -106,7 +106,7 @@
 {
     RGNOBJ * obj;
 
-    dprintf_region(stddeb, "SetRectRgn: "NPFMT" %d,%d-%d,%d\n", 
+    dprintf_region(stddeb, "SetRectRgn: %04x %d,%d-%d,%d\n", 
 		   hrgn, left, top, right, bottom );
     
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( hrgn, REGION_MAGIC ))) return;
@@ -143,7 +143,7 @@
     if (!(hrgn = GDI_AllocObject( sizeof(RGNOBJ), REGION_MAGIC ))) return 0;
     obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
     obj->xrgn = XCreateRegion();
-    dprintf_region(stddeb,"CreateRoundRectRgn(%d,%d-%d,%d %dx%d): return="NPFMT"\n",
+    dprintf_region(stddeb,"CreateRoundRectRgn(%d,%d-%d,%d %dx%d): return=%04x\n",
                left, top, right, bottom, ellipse_width, ellipse_height, hrgn );
 
       /* Check parameters */
@@ -276,7 +276,7 @@
     }
     obj = (RGNOBJ *) GDI_HEAP_LIN_ADDR( hrgn );
     obj->xrgn = 0;
-    dprintf_region(stddeb, "CreatePolyPolygonRgn: %d polygons, returning "NPFMT"\n",
+    dprintf_region(stddeb, "CreatePolyPolygonRgn: %d polygons, returning %04x\n",
                    nbpolygons, hrgn );
 
       /* Create X region */
@@ -411,7 +411,7 @@
     RGNOBJ *destObj, *src1Obj, *src2Obj;
     Region destrgn;
 
-    dprintf_region(stddeb, "CombineRgn: "NPFMT","NPFMT" -> "NPFMT" mode=%x\n", 
+    dprintf_region(stddeb, "CombineRgn: %04x,%04x -> %04x mode=%x\n", 
 		   hSrc1, hSrc2, hDest, mode );
     
     if (!(destObj = (RGNOBJ *) GDI_GetObjPtr( hDest, REGION_MAGIC )))
diff --git a/objects/text.c b/objects/text.c
index ad96f0e..2929a01 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -197,9 +197,8 @@
     int width = rect->right - rect->left;
     int max_width = 0;
 
-    dprintf_text(stddeb,"DrawText: '%s', %d , [(%ld,%ld),(%ld,%ld)]\n", str,
-		 count, (LONG)rect->left, (LONG)rect->top, (LONG)rect->right, 
-		 (LONG)rect->bottom);
+    dprintf_text(stddeb,"DrawText: '%s', %d , [(%d,%d),(%d,%d)]\n", str,
+		 count, rect->left, rect->top, rect->right, rect->bottom);
     
     if (count == -1) count = strlen(str);
     strPtr = str;
@@ -308,11 +307,9 @@
 
     dprintf_text(stddeb,"ExtTextOut: %d,%d '%*.*s', %d  flags=%d\n",
             x, y, count, count, str, count, flags);
-    if (lprect != NULL) {
-      dprintf_text(stddeb, "rect %ld %ld %ld %ld\n", (LONG)lprect->left,
-		   (LONG)lprect->top, (LONG)lprect->right,
-		   (LONG)lprect->bottom );
-    }
+    if (lprect != NULL) dprintf_text(stddeb, "rect %d %d %d %d\n",
+                                     lprect->left, lprect->top,
+                                     lprect->right, lprect->bottom );
 
       /* Setup coordinates */
 
@@ -574,7 +571,7 @@
 LONG TabbedTextOut( HDC hdc, short x, short y, LPSTR lpstr, short count, 
                     short cTabStops, LPINT lpTabPos, short nTabOrg )
 {
-    dprintf_text( stddeb, "TabbedTextOut: "NPFMT" %d,%d '%*.*s' %d\n",
+    dprintf_text( stddeb, "TabbedTextOut: %04x %d,%d '%*.*s' %d\n",
                   hdc, x, y, count, count, lpstr, count );
     return TEXT_TabbedTextOut( hdc, x, y, lpstr, count, cTabStops,
                                lpTabPos, nTabOrg, TRUE );
@@ -587,7 +584,7 @@
 DWORD GetTabbedTextExtent( HDC hdc, LPSTR lpstr, int count, 
                           int cTabStops, LPINT lpTabPos )
 {
-    dprintf_text( stddeb, "GetTabbedTextExtent: "NPFMT" '%*.*s' %d\n",
+    dprintf_text( stddeb, "GetTabbedTextExtent: %04x '%*.*s' %d\n",
                   hdc, count, count, lpstr, count );
     return TEXT_TabbedTextOut( hdc, 0, 0, lpstr, count, cTabStops,
                                lpTabPos, 0, FALSE );
diff --git a/programs/progman/ChangeLog b/programs/progman/ChangeLog
index 7a14e2d..c5a2349 100644
--- a/programs/progman/ChangeLog
+++ b/programs/progman/ChangeLog
@@ -1,3 +1,14 @@
+Fri Mar 15 20:56:31 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
+
+	* [main.c]
+ 	`Arrange icons' in group windows
+
+	* [program.c]
+	No sysmenu for program windows
+
+	* [string.c]
+	Update sysmenu after language change
+
 Wed Feb 28 19:21:55 1996  Ulrich Schmid  <uschmid@mail.hh.provi.de>
 
 	* [progman.h] [main.c] [group.c] [program.c] [dialog.c]
diff --git a/programs/progman/Makefile.in b/programs/progman/Makefile.in
index 32f4a44..241c566 100644
--- a/programs/progman/Makefile.in
+++ b/programs/progman/Makefile.in
@@ -12,8 +12,7 @@
 	grpfile.o \
 	license.o \
 	main.o \
-	program.o \
-	winexec.o
+	program.o
 
 STRINGOBJS = \
 	accel.o \
@@ -29,7 +28,7 @@
 @MAKE_RULES@
 
 # Some strings need addresses >= 0x10000
-progman: $(MOSTOBJS) $(STRINGOBJS)
+progman: $(MOSTOBJS) $(STRINGOBJS) $(WINELIB)
 	$(CC) -o progman $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
 
 clean::
diff --git a/programs/progman/main.c b/programs/progman/main.c
index 6775121..4d3cd13 100644
--- a/programs/progman/main.c
+++ b/programs/progman/main.c
@@ -320,7 +320,10 @@
 
       /* Menu Windows */
     case PM_ARRANGE:
-      SendMessage(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0);
+      if (hActiveGroupWnd && !IsIconic(hActiveGroupWnd))
+	ArrangeIconicWindows(hActiveGroupWnd);
+      else
+	SendMessage(Globals.hMDIWnd, WM_MDIICONARRANGE, 0, 0);
       break;
 
       /* Menu Language */
diff --git a/programs/progman/progman.h b/programs/progman/progman.h
index 5d72ed9..875598b 100644
--- a/programs/progman/progman.h
+++ b/programs/progman/progman.h
@@ -11,14 +11,6 @@
 
 #include "windows.h"
 
-/* FIXME should use WinExec from -lwine */
-#ifdef WINELIB
-#define WinExec ProgmanWinExec
-#define WinHelp ProgmanWinHelp
-HANDLE  ProgmanWinExec(LPSTR,WORD);
-BOOL    ProgmanWinHelp(HWND,LPSTR,WORD,DWORD);
-#endif
-
 #define MAX_PATHNAME_LEN 1024
 
 /* Fallback icon */
diff --git a/programs/progman/program.c b/programs/progman/program.c
index adf30ed..d9e4b4a 100644
--- a/programs/progman/program.c
+++ b/programs/progman/program.c
@@ -198,7 +198,7 @@
 
   program->hWnd =
     CreateWindow (STRING_PROGRAM_WIN_CLASS_NAME, (LPSTR)lpszName,
-		  WS_CHILD | WS_OVERLAPPEDWINDOW,
+		  WS_CHILD | WS_CAPTION,
 		  x, y, CW_USEDEFAULT, CW_USEDEFAULT,
 		  group->hWnd, 0, Globals.hInstance, 0);
 
diff --git a/programs/progman/string.c b/programs/progman/string.c
index a040855..be7ae15 100644
--- a/programs/progman/string.c
+++ b/programs/progman/string.c
@@ -5,6 +5,9 @@
  */
 
 #include <windows.h>
+#ifdef WINELIB
+#include <options.h>
+#endif
 #include "progman.h"
 
 /* Class names */
@@ -33,6 +36,9 @@
 
 VOID STRING_SelectLanguage(LPCSTR lang)
 {
+  HMENU  hMainMenu;
+  HLOCAL hGroup;
+
   /* Change string table */
   Globals.StringTable = StringTableEn;
   if (!lstrcmp(lang, "De")) Globals.StringTable = StringTableDe;
@@ -51,28 +57,23 @@
   lstrcpyn(STRING_SYMBOL_Xx  + sizeof(STRING_SYMBOL_Xx)  - 3, lang, 3);
   lstrcpyn(STRING_EXECUTE_Xx + sizeof(STRING_EXECUTE_Xx) - 3, lang, 3);
 
-  /* Destroy old menu */
-  if (Globals.hMainMenu)
+  /* Create menu */
+  hMainMenu = LoadMenu(Globals.hInstance, STRING_MAIN_Xx);
+  if (hMainMenu)
   {
-    SendMessage(Globals.hMDIWnd, WM_MDISETMENU, (WPARAM) NULL, (LPARAM) NULL);
-#if 0 /* FIXME when MDISetMenu is complete */
-    DestroyMenu(Globals.hMainMenu);
-#endif
-  }
-
-  /* Create new menu */
-  Globals.hMainMenu = LoadMenu(Globals.hInstance, STRING_MAIN_Xx);
-  if (Globals.hMainMenu)
-  {
-    Globals.hFileMenu    = GetSubMenu(Globals.hMainMenu, 0);
-    Globals.hOptionMenu  = GetSubMenu(Globals.hMainMenu, 1);
-    Globals.hWindowsMenu = GetSubMenu(Globals.hMainMenu, 2);
+    Globals.hFileMenu    = GetSubMenu(hMainMenu, 0);
+    Globals.hOptionMenu  = GetSubMenu(hMainMenu, 1);
+    Globals.hWindowsMenu = GetSubMenu(hMainMenu, 2);
 
     if (Globals.hMDIWnd)
       SendMessage(Globals.hMDIWnd, WM_MDISETMENU,
-		  (WPARAM) Globals.hMainMenu,
+		  (WPARAM) hMainMenu,
 		  (LPARAM) Globals.hWindowsMenu);
-    else SetMenu(Globals.hMainWnd, Globals.hMainMenu);
+    else SetMenu(Globals.hMainWnd, hMainMenu);
+
+    /* Destroy old menu */
+    if (Globals.hMainMenu) DestroyMenu(Globals.hMainMenu);
+    Globals.hMainMenu = hMainMenu;
   }
   /* Unsupported language */
   else if(lstrcmp(lang, "En")) STRING_SelectLanguage("En");
@@ -85,6 +86,17 @@
   /* have to be last because of
    * the possible recursion */
   Globals.lpszLanguage = lang;
+#ifdef WINELIB
+  if (!lstrcmp(lang, "De")) Options.language = LANG_De;
+  if (!lstrcmp(lang, "En")) Options.language = LANG_En;
+  GetSystemMenu(Globals.hMainWnd, TRUE);
+  for (hGroup = GROUP_FirstGroup(); hGroup;
+       hGroup = GROUP_NextGroup(hGroup))
+    {
+      GROUP *group = LocalLock(hGroup);
+      GetSystemMenu(group->hWnd, TRUE);
+    }
+#endif
 }
 
 /* Local Variables:    */
diff --git a/programs/progman/winexec.c b/programs/progman/winexec.c
deleted file mode 100644
index 722576c..0000000
--- a/programs/progman/winexec.c
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifdef WINELIB
-#include <unistd.h>
-#include <string.h>
-#include "windows.h"
-#include "winbase.h"
-#include "options.h"
-#include "dos_fs.h"
-#include "debug.h"
-#include "progman.h"
-
-#define MAX_CMDLINE_SIZE 256
-
-/* FIXME should use WinExec from -lwine */
-
-HANDLE ProgmanWinExec( LPSTR lpCmdLine, WORD nCmdShow )
-{
-  char  wine[MAX_CMDLINE_SIZE];
-  char  filename[MAX_CMDLINE_SIZE], *p;
-  char  cmdline[MAX_CMDLINE_SIZE];
-  const char *argv[10], **argptr;
-  const char *unixfilename;
-  int   simplename = 1;
-
-  if (fork()) return(INVALID_HANDLE_VALUE);
-
-  strncpy( filename, lpCmdLine, MAX_CMDLINE_SIZE );
-  filename[MAX_CMDLINE_SIZE-1] = '\0';
-  for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++)
-    if ((*p == ':') || (*p == ':') || (*p == '/')) simplename = 0;
-  if (*p)
-    {
-      strncpy( cmdline, p + 1, 128 );
-      cmdline[127] = '\0';
-    }
-  else cmdline[0] = '\0';
-  *p = '\0';
-
-  if (simplename) unixfilename = filename;
-  else unixfilename = DOSFS_GetUnixFileName(filename, 0);
-
-  argptr = argv;
-  *argptr++ = unixfilename;
-  if (nCmdShow == SW_SHOWMINIMIZED) *argptr++ = "-iconic";
-  if (cmdline[0]) *argptr++ = cmdline;
-  *argptr++ = 0;
-  execvp(argv[0], (char**)argv);
-
-  PROFILE_GetWineIniString("progman", "wine", "wine", 
-			   wine, sizeof(wine));
-  argptr = argv;
-  *argptr++ = wine;
-  *argptr++ = "-language";
-  *argptr++ = Globals.lpszLanguage;
-  if (nCmdShow == SW_SHOWMINIMIZED) *argptr++ = "-iconic";
-  *argptr++ = lpCmdLine;
-  *argptr++ = 0;
-  execvp(argv[0] , (char**)argv);
-
-  printf("Cannot exec `%s %s %s%s %s'\n",
-	 wine, "-language", Globals.lpszLanguage,
-	 nCmdShow == SW_SHOWMINIMIZED ? " -iconic" : "",
-	 lpCmdLine);
-  exit(1);
-}
-
-BOOL ProgmanWinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData)
-{
-  char	str[256];
-  dprintf_exec(stddeb,"WinHelp(%s, %u, %lu)\n", 
-	       lpHelpFile, wCommand, dwData);
-  switch(wCommand) {
-  case 0:
-  case HELP_HELPONHELP:
-    GetWindowsDirectory(str, sizeof(str));
-    strcat(str, "\\winhelp.exe winhelp.hlp");
-    dprintf_exec(stddeb,"'%s'\n", str);
-    break;
-  case HELP_INDEX:
-    GetWindowsDirectory(str, sizeof(str));
-    strcat(str, "\\winhelp.exe ");
-    strcat(str, lpHelpFile);
-    dprintf_exec(stddeb,"'%s'\n", str);
-    break;
-  default:
-    return FALSE;
-  }
-  WinExec(str, SW_SHOWNORMAL);
-  return(TRUE);
-}
-
-#endif
diff --git a/win32/Makefile.in b/win32/Makefile.in
index 1c2a1a9..2ff2ccf 100644
--- a/win32/Makefile.in
+++ b/win32/Makefile.in
@@ -5,6 +5,7 @@
 	advapi.c \
 	code_page.c \
 	console.c \
+	cursoricon32.c \
 	environment.c \
 	error.c \
 	except.c \
diff --git a/win32/code_page.c b/win32/code_page.c
index 1ec9953..43dc261 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -8,6 +8,7 @@
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
+#include "winnls.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -47,3 +48,41 @@
 {
     return (srclen==-1) ? strlen(src) * 2: srclen*2; 
 }
+
+int WideCharToMultiByte(UINT page, DWORD flags, WCHAR *src, int srclen,
+						char *dst, int dstlen, char* defchar, BOOL *used)
+{
+	int count = 0;
+	int dont_copy= (dstlen==0);
+	if(page!=GetACP() && page!=CP_OEMCP && page!=CP_ACP)
+		fprintf(stdnimp,"Conversion in CP %d not supported\n",page);
+	if(flags)
+		fprintf(stdnimp,"WideCharToMultiByte flags %lx not supported\n",flags);
+	if(used)
+		*used=0;
+	while(srclen && (dont_copy || dstlen))
+	{
+		if(!dont_copy){
+			if(*src<256)
+				*dst = *src;
+			else
+			{
+				/* FIXME: Is this correct ?*/
+				if(flags & WC_DEFAULTCHAR){
+					*dst = defchar ? *defchar : '?';
+					if(used)*used=1;
+				}
+			}
+			dstlen--;
+			dst++;
+		}
+		count++;
+		if(!*src)
+			break;
+		if(srclen!=-1)srclen--;
+		src++;
+	}
+	return count;
+}
+
+		
diff --git a/win32/cursoricon32.c b/win32/cursoricon32.c
new file mode 100644
index 0000000..633eee2
--- /dev/null
+++ b/win32/cursoricon32.c
@@ -0,0 +1,461 @@
+/*
+ * Cursor and icon support
+ *
+ * Copyright 1995 Alexandre Julliard
+ * Copyright 1996 Martin von Loewis
+ */
+
+/*
+ * Theory:
+ *
+ * Cursors and icons are stored in a global heap block, with the
+ * following layout:
+ *
+ * CURSORICONINFO info;
+ * BYTE[]         ANDbits;
+ * BYTE[]         XORbits;
+ *
+ * The bits structures are in the format of a device-dependent bitmap.
+ *
+ * This layout is very sub-optimal, as the bitmap bits are stored in
+ * the X client instead of in the server like other bitmaps; however,
+ * some programs (notably Paint Brush) expect to be able to manipulate
+ * the bits directly :-(
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include "windows.h"
+#include "bitmap.h"
+#include "callback.h"
+#include "cursoricon.h"
+#include "sysmetrics.h"
+#include "win.h"
+#include "struct32.h"
+#include "string32.h"
+#include "resource32.h"
+#include "stddebug.h"
+#include "debug.h"
+#include "xmalloc.h"
+#include "task.h"
+
+
+/**********************************************************************
+ *	    CURSORICON32_FindBestIcon
+ *
+ * Find the icon closest to the requested size and number of colors.
+ */
+static ICONDIRENTRY32 *CURSORICON32_FindBestIcon( CURSORICONDIR32 *dir, 
+	int width, int height, int colors )
+{
+    int i, maxcolors, maxwidth, maxheight;
+    ICONDIRENTRY32 *entry, *bestEntry = NULL;
+
+    if (dir->idCount < 1)
+    {
+        fprintf( stderr, "Icon: empty directory!\n" );
+        return NULL;
+    }
+    if (dir->idCount == 1) return &dir->idEntries[0].icon;  /* No choice... */
+
+    /* First find the exact size with less colors */
+
+    maxcolors = 0;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth == width) && (entry->bHeight == height) &&
+            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
+        {
+            bestEntry = entry;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* First find the exact size with more colors */
+
+    maxcolors = 255;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth == width) && (entry->bHeight == height) &&
+            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
+        {
+            bestEntry = entry;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a smaller one with less colors */
+
+    maxcolors = maxwidth = maxheight = 0;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= width) && (entry->bHeight <= height) &&
+            (entry->bWidth >= maxwidth) && (entry->bHeight >= maxheight) &&
+            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a smaller one with more colors */
+
+    maxcolors = 255;
+    maxwidth = maxheight = 0;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= width) && (entry->bHeight <= height) &&
+            (entry->bWidth >= maxwidth) && (entry->bHeight >= maxheight) &&
+            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a larger one with less colors */
+
+    maxcolors = 0;
+    maxwidth = maxheight = 255;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= maxwidth) && (entry->bHeight <= maxheight) &&
+            (entry->bColorCount <= colors) && (entry->bColorCount > maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find a larger one with more colors */
+
+    maxcolors = maxwidth = maxheight = 255;
+    for (i = 0, entry = &dir->idEntries[0].icon; i < dir->idCount; i++,entry++)
+        if ((entry->bWidth <= maxwidth) && (entry->bHeight <= maxheight) &&
+            (entry->bColorCount > colors) && (entry->bColorCount <= maxcolors))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->bWidth;
+            maxheight = entry->bHeight;
+            maxcolors = entry->bColorCount;
+        }
+
+    return bestEntry;
+}
+
+
+/**********************************************************************
+ *	    CURSORICON32_FindBestCursor
+ *
+ * Find the cursor closest to the requested size.
+ */
+static CURSORDIRENTRY32 *CURSORICON32_FindBestCursor( CURSORICONDIR32 *dir,
+                                                  int width, int height )
+{
+    int i, maxwidth, maxheight;
+    CURSORDIRENTRY32 *entry, *bestEntry = NULL;
+
+    if (dir->idCount < 1)
+    {
+        fprintf( stderr, "Cursor: empty directory!\n" );
+        return NULL;
+    }
+    if (dir->idCount == 1) return &dir->idEntries[0].cursor; /* No choice... */
+
+    /* First find the largest one smaller than or equal to the requested size*/
+
+    maxwidth = maxheight = 0;
+    for(i = 0,entry = &dir->idEntries[0].cursor; i < dir->idCount; i++,entry++)
+        if ((entry->wWidth <= width) && (entry->wHeight <= height) &&
+            (entry->wWidth > maxwidth) && (entry->wHeight > maxheight))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->wWidth;
+            maxheight = entry->wHeight;
+        }
+    if (bestEntry) return bestEntry;
+
+    /* Now find the smallest one larger than the requested size */
+
+    maxwidth = maxheight = 255;
+    for(i = 0,entry = &dir->idEntries[0].cursor; i < dir->idCount; i++,entry++)
+        if ((entry->wWidth < maxwidth) && (entry->wHeight < maxheight))
+        {
+            bestEntry = entry;
+            maxwidth  = entry->wWidth;
+            maxheight = entry->wHeight;
+        }
+
+    return bestEntry;
+}
+
+
+/**********************************************************************
+ *	    CURSORICON32_LoadDirEntry
+ *
+ * Load the icon/cursor directory for a given resource name and find the
+ * best matching entry.
+ */
+static BOOL CURSORICON32_LoadDirEntry(HANDLE hInstance, LPCWSTR name,
+                                    int width, int height, int colors,
+                                    BOOL fCursor, CURSORICONDIRENTRY32 *dirEntry)
+{
+    HANDLE32 hRsrc;
+    HANDLE32 hMem;
+    CURSORICONDIR32 *dir;
+    CURSORICONDIRENTRY32 *entry = NULL;
+
+    if (!(hRsrc = FindResource32( hInstance, name,
+                (LPCWSTR)(fCursor ? RT_GROUP_CURSOR : RT_GROUP_ICON) )))
+        return FALSE;
+    if (!(hMem = LoadResource32( hInstance, hRsrc ))) return FALSE;
+    if ((dir = (CURSORICONDIR32 *)LockResource32( hMem )))
+    {
+        if (fCursor)
+            entry = (CURSORICONDIRENTRY32 *)CURSORICON32_FindBestCursor( dir,
+                                                               width, height );
+        else
+            entry = (CURSORICONDIRENTRY32 *)CURSORICON32_FindBestIcon( dir,
+                                                       width, height, colors );
+        if (entry) *dirEntry = *entry;
+    }
+    FreeResource32( hMem );
+    return (entry != NULL);
+}
+
+
+/**********************************************************************
+ *	    CURSORICON32_LoadHandler 
+ *
+ * Create a cursor or icon from a resource.
+ */
+static HANDLE CURSORICON32_LoadHandler( HANDLE32 handle, HINSTANCE hInstance,
+                                      BOOL fCursor )
+{
+    HANDLE hAndBits, hXorBits, hRes;
+    HDC hdc;
+    int size, sizeAnd, sizeXor;
+    POINT hotspot = { 0 ,0 };
+    BITMAPOBJ *bmpXor, *bmpAnd;
+    BITMAPINFO *bmi, *pInfo;
+    CURSORICONINFO *info;
+    char *bits;
+
+	hRes=0;
+    if (fCursor)  /* If cursor, get the hotspot */
+    {
+        POINT *pt = (POINT *)LockResource32( handle );
+        hotspot = *pt;
+        bmi = (BITMAPINFO *)(pt + 1);
+    }
+    else bmi = (BITMAPINFO *)LockResource32( handle );
+
+    /* Create a copy of the bitmap header */
+
+    size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
+    /* Make sure we have room for the monochrome bitmap later on */
+    size = MAX( size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) );
+    pInfo = (BITMAPINFO *)xmalloc( size );
+    memcpy( pInfo, bmi, size );
+
+    if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+    {
+        if (pInfo->bmiHeader.biCompression != BI_RGB)
+        {
+            fprintf(stderr,"Unknown size for compressed icon bitmap.\n");
+            free( pInfo );
+            return 0;
+        }
+        pInfo->bmiHeader.biHeight /= 2;
+    }
+    else if (pInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
+    {
+        BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)pInfo;
+        core->bcHeight /= 2;
+    }
+    else
+    {
+        fprintf( stderr, "CURSORICON32_Load: Unknown bitmap length %ld!\n",
+                 pInfo->bmiHeader.biSize );
+        free( pInfo );
+        return 0;
+    }
+
+    /* Create the XOR bitmap */
+
+    if (!(hdc = GetDC( 0 )))
+    {
+        free( pInfo );
+        return 0;
+    }
+
+    hXorBits = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
+                               (char*)bmi + size, pInfo, DIB_RGB_COLORS );
+
+    /* Fix the bitmap header to load the monochrome mask */
+
+    if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
+    {
+        BITMAPINFOHEADER *bih = &pInfo->bmiHeader;
+        RGBQUAD *rgb = pInfo->bmiColors;
+        bits = (char *)bmi + size +
+            DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount)*bih->biHeight;
+        bih->biBitCount = 1;
+        bih->biClrUsed = bih->biClrImportant = 2;
+        rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00;
+        rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff;
+        rgb[0].rgbReserved = rgb[1].rgbReserved = 0;
+    }
+    else
+    {
+        BITMAPCOREHEADER *bch = (BITMAPCOREHEADER *)pInfo;
+        RGBTRIPLE *rgb = (RGBTRIPLE *)(bch + 1);
+        bits = (char *)bmi + size +
+            DIB_GetImageWidthBytes(bch->bcWidth,bch->bcBitCount)*bch->bcHeight;
+        bch->bcBitCount = 1;
+        rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00;
+        rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff;
+    }
+
+    /* Create the AND bitmap */
+
+    hAndBits = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
+                               bits, pInfo, DIB_RGB_COLORS );
+    ReleaseDC( 0, hdc );
+
+    /* Now create the CURSORICONINFO structure */
+
+    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( hXorBits, BITMAP_MAGIC );
+    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( hAndBits, BITMAP_MAGIC );
+    sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
+    sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
+
+    if (!(hRes = GlobalAlloc( GMEM_MOVEABLE,
+                                sizeof(CURSORICONINFO) + sizeXor + sizeAnd)))
+    {
+        DeleteObject( hXorBits );
+        DeleteObject( hAndBits );
+        return 0;
+    }
+
+    /* Make it owned by the module */
+    if (hInstance) FarSetOwner( hRes, (WORD)(DWORD)GetExePtr(hInstance) );
+
+    info = (CURSORICONINFO *)GlobalLock( hRes );
+    info->ptHotSpot.x   = hotspot.x;
+    info->ptHotSpot.y   = hotspot.y;
+    info->nWidth        = bmpXor->bitmap.bmWidth;
+    info->nHeight       = bmpXor->bitmap.bmHeight;
+    info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
+    info->bPlanes       = bmpXor->bitmap.bmPlanes;
+    info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
+
+    /* Transfer the bitmap bits to the CURSORICONINFO structure */
+
+    GetBitmapBits( hAndBits, sizeAnd, (char *)(info + 1) );
+    GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
+    DeleteObject( hXorBits );
+    DeleteObject( hAndBits );
+    GlobalUnlock( hRes );
+    return hRes;
+}
+
+/**********************************************************************
+ *	    CURSORICON32_Load
+ *
+ * Load a cursor or icon.
+ */
+static HANDLE CURSORICON32_Load( HANDLE hInstance, LPCWSTR name, int width,
+                               int height, int colors, BOOL fCursor )
+{
+    HANDLE32 handle;
+	HANDLE hRet;
+    HANDLE32  hRsrc;
+    CURSORICONDIRENTRY32 dirEntry;
+
+	if(!hInstance)	/* OEM cursor/icon */
+	{
+		WORD resid;
+		if(HIWORD(name))
+		{
+			LPSTR ansi;
+			ansi=STRING32_DupUniToAnsi(name);
+			if(ansi[0]=='#')	/*Check for '#xxx' name */
+			{
+				resid=atoi(ansi+1);
+				free(ansi);
+			}else{
+				free(ansi);
+				return 0;
+			}
+		}
+		else
+			resid=(WORD)(int)name;
+		return OBM_LoadCursorIcon(resid, fCursor);
+	}
+
+    /* Find the best entry in the directory */
+
+    if (!CURSORICON32_LoadDirEntry( hInstance, name, width, height,
+                                  colors, fCursor, &dirEntry )) return 0;
+
+    /* Load the resource */
+
+    if (!(hRsrc = FindResource32( hInstance,
+                      (LPWSTR) (DWORD) dirEntry.icon.wResId,
+                      (LPWSTR) (fCursor ? RT_CURSOR : RT_ICON )))) return 0;
+    if (!(handle = LoadResource32( hInstance, hRsrc ))) return 0;
+
+    hRet = CURSORICON32_LoadHandler( handle, hInstance, fCursor );
+    FreeResource32(handle);
+    return hRet;
+}
+
+
+/***********************************************************************
+ *           LoadCursor
+ */
+HCURSOR WIN32_LoadCursorW( HANDLE hInstance, LPCWSTR name )
+{
+    return CURSORICON32_Load( hInstance, name,
+                            SYSMETRICS_CXCURSOR, SYSMETRICS_CYCURSOR, 1, TRUE);
+}
+
+HCURSOR WIN32_LoadCursorA(HANDLE hInstance, LPCSTR name)
+{
+	HCURSOR res=0;
+	if(!HIWORD(name))
+		return WIN32_LoadCursorW(hInstance, name);
+	else {
+		LPWSTR uni = STRING32_DupAnsiToUni(name);
+		res = WIN32_LoadCursorW(hInstance, uni);
+		free(uni);
+	}
+	return res;
+}
+
+
+/***********************************************************************
+ *           LoadIcon
+ */
+HICON WIN32_LoadIconW( HANDLE hInstance, LPCWSTR name )
+{
+    return CURSORICON32_Load( hInstance, name,
+                            SYSMETRICS_CXICON, SYSMETRICS_CYICON,
+                            MIN( 16, 1 << screenDepth ), FALSE );
+}
+
+HICON WIN32_LoadIconA( HANDLE hInstance, LPCSTR name)
+{
+	HICON res=0;
+	if(!HIWORD(name))
+		return WIN32_LoadIconW(hInstance, name);
+	else {
+		LPWSTR uni = STRING32_DupAnsiToUni(name);
+		res = WIN32_LoadIconW(hInstance, uni);
+		free(uni);
+	}
+	return res;
+}
+	
diff --git a/win32/file.c b/win32/file.c
index 1dd15bc..a14d6db 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -474,3 +474,24 @@
 
     return rc;
 }
+
+/**************************************************************************
+ *              GetFileAttributes
+ */
+DWORD GetFileAttributesA(LPCSTR lpFileName)
+{
+	struct stat buf;
+	DWORD res=0;
+	if(stat(lpFileName,&buf)==-1)
+	{
+		SetLastError(ErrnoToLastError(errno));
+		return 0;
+	}
+    if(buf.st_mode & S_IFREG)
+        res |= FILE_ATTRIBUTE_NORMAL;
+    if(buf.st_mode & S_IFDIR)
+        res |= FILE_ATTRIBUTE_DIRECTORY;
+    if((buf.st_mode & S_IWRITE) == 0)
+        res |= FILE_ATTRIBUTE_READONLY;
+	return res;
+}
diff --git a/win32/param32.c b/win32/param32.c
index 7d6f95a..a5323d2 100644
--- a/win32/param32.c
+++ b/win32/param32.c
@@ -10,6 +10,7 @@
 #include "windows.h"
 #include "winerror.h"
 #include "struct32.h"
+#include "stackframe.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -38,3 +39,10 @@
 
         return retval;
 }
+
+ATOM WIN32_GlobalAddAtomA(LPCTSTR str)
+{
+    char buffer[256];  /* 16-bit atoms are limited to 255 anyway */
+    lstrcpyn( buffer, str, sizeof(buffer) );
+    return GlobalAddAtom(MAKE_SEGPTR(buffer));
+}
diff --git a/win32/resource.c b/win32/resource.c
index ed81d60..19a9e41 100644
--- a/win32/resource.c
+++ b/win32/resource.c
@@ -132,7 +132,7 @@
     struct w_files *wptr = wine_files;
 
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "LoadResource: module="NPFMT" res="NPFMT"\n",
+    dprintf_resource(stddeb, "LoadResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
     while (wptr != NULL && (wptr->hModule != hModule))
@@ -169,7 +169,7 @@
 INT AccessResource32( HINSTANCE hModule, HRSRC hRsrc )
 {
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "AccessResource: module="NPFMT" res="NPFMT"\n",
+    dprintf_resource(stddeb, "AccessResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
     if (!hRsrc) return 0;
 	fprintf(stderr,"AccessResource32: not implemented\n");
@@ -183,7 +183,7 @@
 DWORD SizeofResource32( HINSTANCE hModule, HRSRC hRsrc )
 {
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
-    dprintf_resource(stddeb, "SizeofResource: module="NPFMT" res="NPFMT"\n",
+    dprintf_resource(stddeb, "SizeofResource: module=%04x res=%04x\n",
                      hModule, hRsrc );
 	fprintf(stderr,"SizeofResource32: not implemented\n");
 	return 0;
@@ -203,10 +203,10 @@
     int 	i, n;
 
     if (HIWORD(lpTableName))
-        dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" '%s'\n",
+        dprintf_accel( stddeb, "LoadAccelerators: %04x '%s'\n",
                       instance, (char *)( lpTableName ) );
     else
-        dprintf_accel( stddeb, "LoadAccelerators: "NPFMT" %04x\n",
+        dprintf_accel( stddeb, "LoadAccelerators: %04x %04x\n",
                        instance, LOWORD(lpTableName) );
 
     if (!(hRsrc = FindResource32( instance, lpTableName, 
@@ -261,7 +261,7 @@
     int string_num;
     int i;
 
-    dprintf_resource(stddeb, "LoadString: instance = "NPFMT", id = %04x, buffer = %08x, "
+    dprintf_resource(stddeb, "LoadString: instance = %04x, id = %04x, buffer = %08x, "
 	   "length = %d\n", instance, (int)resource_id, (int) buffer, buflen);
 
     hrsrc = FindResource32( instance, (LPCWSTR)((resource_id>>4)+1), 
diff --git a/win32/thread.c b/win32/thread.c
index c88dda4..5e203c1 100644
--- a/win32/thread.c
+++ b/win32/thread.c
@@ -6,11 +6,13 @@
 
 #include <stdio.h>
 #include <unistd.h>
+#include <string.h>
 #include "windows.h"
 #include "winerror.h"
 #include "kernel32.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "xmalloc.h"
 
 /***********************************************************************
  *           GetCurrentThreadId   (KERNEL32.200)
@@ -36,3 +38,68 @@
 	return 0;
 }
 
+/**********************************************************************
+ *          Critical Sections are currently ignored
+ */
+void WINAPI InitializeCriticalSection(CRITICAL_SECTION *lpCrit)
+{
+	memset(lpCrit,0,sizeof(CRITICAL_SECTION));
+}
+
+void WINAPI EnterCriticalSection(CRITICAL_SECTION* lpCrit)
+{
+	return;
+}
+
+void WINAPI LeaveCriticalSection(CRITICAL_SECTION* lpCrit)
+{
+	return;
+}
+
+void WINAPI DeleteCriticalSection(CRITICAL_SECTION* lpCrit)
+{
+	return;
+}
+
+/***********************************************************************
+ *           Tls is available only for the single thread
+ */
+static LPVOID* Tls=0;
+static int TlsCount=0;
+
+DWORD WINAPI TlsAlloc()
+{
+	if(!Tls){
+		TlsCount++;
+		Tls=xmalloc(sizeof(LPVOID));
+		return 0;
+	}
+	Tls=xrealloc(Tls,sizeof(LPVOID)*(++TlsCount));
+	return TlsCount-1;
+}
+
+void TlsFree(DWORD index)
+{
+	/*FIXME: should remember that it has been freed */
+	return;
+}
+
+LPVOID TlsGetValue(DWORD index)
+{
+	if(index>=TlsCount)
+	{
+		/* FIXME: Set last error*/
+		return 0;
+	}
+	return Tls[index];
+}
+
+void TlsSetValue(DWORD index,LPVOID value)
+{
+	if(index>=TlsCount)
+	{
+		/* FIXME: Set last error*/
+		return;
+	}
+	Tls[index]=value;
+}
diff --git a/win32/user32.c b/win32/user32.c
index 3c94151..42a4582 100644
--- a/win32/user32.c
+++ b/win32/user32.c
@@ -322,8 +322,8 @@
 	/* FIXME: proper modalframe handling ??*/
 	if (dlgTempl->style & DS_MODALFRAME) exStyle |= WS_EX_DLGMODALFRAME;
 
-	/* FIXME: AdjustWindowRectEx */
-
+        AdjustWindowRectEx( &rect, dlgTempl->style,
+                            hMenu ? TRUE : FALSE , exStyle );
 	rect.right -= rect.left;
 	rect.bottom -= rect.top;
 
diff --git a/windows/caret.c b/windows/caret.c
index 268b937..b753d86 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -2,6 +2,7 @@
  * Caret functions
  *
  * Copyright 1993 David Metcalfe
+ * Copyright 1996 Frans van Dorsselaer
  */
 
 #include "windows.h"
@@ -22,8 +23,7 @@
     short         y;
     short         width;
     short         height;
-    COLORREF      color;
-    HBITMAP       bitmap;
+    HBRUSH        hBrush;
     WORD          timeout;
     WORD          timerid;
 } CARET;
@@ -35,7 +35,7 @@
     CARET_TOGGLE,
 } DISPLAY_CARET;
 
-static CARET Caret = { (HWND)0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+static CARET Caret = { 0, };
 
 
 /*****************************************************************
@@ -52,9 +52,7 @@
 void CARET_DisplayCaret(DISPLAY_CARET status)
 {
     HDC hdc;
-    HBRUSH hBrush;
     HBRUSH hPrevBrush;
-    HRGN rgn;
 
     if (Caret.on && (status == CARET_ON)) return;
     if (!Caret.on && (status == CARET_OFF)) return;
@@ -62,21 +60,11 @@
     /* So now it's always a toggle */
 
     Caret.on = !Caret.on;
-    hdc = GetDC(Caret.hwnd);
-    if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1)
-	hBrush = CreateSolidBrush(Caret.color);
-    else
-	hBrush = CreatePatternBrush(Caret.bitmap);
-    hPrevBrush = SelectObject(hdc, (HANDLE)hBrush);
-    SetROP2(hdc, R2_XORPEN);
-    rgn = CreateRectRgn(Caret.x, Caret.y, 
-			Caret.x + Caret.width,
-			Caret.y + Caret.height);
-    FillRgn(hdc, rgn, hBrush);
-    DeleteObject( rgn );
+    if (!(hdc = GetDCEx( Caret.hwnd, 0, DCX_USESTYLE | DCX_CACHE ))) return;
+    hPrevBrush = SelectObject( hdc, Caret.hBrush );
+    PatBlt( hdc, Caret.x, Caret.y, Caret.width, Caret.height, PATINVERT );
     SelectObject( hdc, hPrevBrush );
-    DeleteObject( hBrush );
-    ReleaseDC(Caret.hwnd, hdc);
+    ReleaseDC( Caret.hwnd, hdc );
 }
 
   
@@ -85,8 +73,8 @@
  */
 WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime)
 {
-    dprintf_caret(stddeb,"CARET_Callback: hwnd="NPFMT", timerid=%d, "
-		"caret=%d\n", hwnd, timerid, Caret.on);
+    dprintf_caret(stddeb,"CARET_Callback: hwnd=%04x, timerid=%d, caret=%d\n",
+                  hwnd, timerid, Caret.on);
 	
     CARET_DisplayCaret(CARET_TOGGLE);
     return 0;
@@ -157,34 +145,36 @@
  */
 BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height)
 {
-    dprintf_caret(stddeb,"CreateCaret: hwnd="NPFMT"\n", hwnd);
+    dprintf_caret(stddeb,"CreateCaret: hwnd=%04x\n", hwnd);
 
     if (!hwnd) return FALSE;
 
     /* if cursor already exists, destroy it */
     if (Caret.hwnd) DestroyCaret();
 
-    if (bitmap && bitmap != (HBITMAP)1) Caret.bitmap = bitmap;
-
-    if (width)
-        Caret.width = width;
+    if (bitmap && (bitmap != 1))
+    {
+        BITMAP bmp;
+        if (!GetObject( bitmap, sizeof(bmp), (LPSTR)&bmp )) return FALSE;
+        Caret.width = bmp.bmWidth;
+        Caret.height = bmp.bmHeight;
+        /* FIXME: we should make a copy of the bitmap instead of a brush */
+        Caret.hBrush = CreatePatternBrush( bitmap );
+    }
     else
-	Caret.width = GetSystemMetrics(SM_CXBORDER);
-
-    if (height)
-	Caret.height = height;
-    else
-	Caret.height = GetSystemMetrics(SM_CYBORDER);
+    {
+        Caret.width = width ? width : GetSystemMetrics(SM_CXBORDER);
+        Caret.height = height ? height : GetSystemMetrics(SM_CYBORDER);
+        Caret.hBrush = CreateSolidBrush( bitmap ? GetSysColor(COLOR_GRAYTEXT) :
+                                         GetSysColor(COLOR_WINDOW) );
+    }
 
     Caret.hwnd = hwnd;
     Caret.hidden = 1;
     Caret.on = FALSE;
     Caret.x = 0;
     Caret.y = 0;
-    if (bitmap == (HBITMAP)1)
-	Caret.color = GetSysColor(COLOR_GRAYTEXT);
-    else
-	Caret.color = GetSysColor(COLOR_WINDOW);
+
     Caret.timeout = GetProfileInt( "windows", "CursorBlinkRate", 750 );
 
     CARET_Initialize();
@@ -201,9 +191,10 @@
 {
     if (!Caret.hwnd) return FALSE;
 
-    dprintf_caret(stddeb,"DestroyCaret: hwnd="NPFMT", timerid=%d\n",
+    dprintf_caret(stddeb,"DestroyCaret: hwnd=%04x, timerid=%d\n",
 		Caret.hwnd, Caret.timerid);
 
+    DeleteObject( Caret.hBrush );
     CARET_KillTimer();
     CARET_DisplayCaret(CARET_OFF);
 
@@ -243,8 +234,8 @@
     if (!Caret.hwnd) return;
     if (hwnd && (Caret.hwnd != hwnd)) return;
 
-    dprintf_caret(stddeb,"HideCaret: hwnd="NPFMT", hidden=%d\n",
-		hwnd, Caret.hidden);
+    dprintf_caret(stddeb,"HideCaret: hwnd=%04x, hidden=%d\n",
+                  hwnd, Caret.hidden);
 
     CARET_KillTimer();
     CARET_DisplayCaret(CARET_OFF);
@@ -261,7 +252,7 @@
     if (!Caret.hwnd) return;
     if (hwnd && (Caret.hwnd != hwnd)) return;
 
-    dprintf_caret(stddeb,"ShowCaret: hwnd="NPFMT", hidden=%d\n",
+    dprintf_caret(stddeb,"ShowCaret: hwnd=%04x, hidden=%d\n",
 		hwnd, Caret.hidden);
 
     if (Caret.hidden)
@@ -284,7 +275,7 @@
 {
     if (!Caret.hwnd) return;
 
-    dprintf_caret(stddeb,"SetCaretBlinkTime: hwnd="NPFMT", msecs=%d\n",
+    dprintf_caret(stddeb,"SetCaretBlinkTime: hwnd=%04x, msecs=%d\n",
 		Caret.hwnd, msecs);
 
     Caret.timeout = msecs;
@@ -300,7 +291,7 @@
 {
     if (!Caret.hwnd) return 0;
 
-    dprintf_caret(stddeb,"GetCaretBlinkTime: hwnd="NPFMT", msecs=%d\n",
+    dprintf_caret(stddeb,"GetCaretBlinkTime: hwnd=%04x, msecs=%d\n",
 		Caret.hwnd, Caret.timeout);
 
     return Caret.timeout;
@@ -315,8 +306,8 @@
 {
     if (!Caret.hwnd || !pt) return;
 
-    dprintf_caret(stddeb,"GetCaretPos: hwnd="NPFMT", pt=%p, x=%d, y=%d\n",
-		Caret.hwnd, pt, Caret.x, Caret.y);
+    dprintf_caret(stddeb,"GetCaretPos: hwnd=%04x, pt=%p, x=%d, y=%d\n",
+                  Caret.hwnd, pt, Caret.x, Caret.y);
 
     pt->x = Caret.x;
     pt->y = Caret.y;
diff --git a/windows/class.c b/windows/class.c
index 527127e..04a05df 100644
--- a/windows/class.c
+++ b/windows/class.c
@@ -159,7 +159,7 @@
     HCLASS handle, prevClass;
     int classExtra;
 
-    dprintf_class( stddeb, "RegisterClass: wndproc=%08lx hinst="NPFMT" name='%s' background "NPFMT"\n",
+    dprintf_class( stddeb, "RegisterClass: wndproc=%08lx hinst=%04x name='%s' background %04x\n",
                  (DWORD)class->lpfnWndProc, class->hInstance,
                  HIWORD(class->lpszClassName) ?
                   (char *)PTR_SEG_TO_LIN(class->lpszClassName) : "(int)",
@@ -258,11 +258,7 @@
     if (classPtr->wc.hbrBackground) DeleteObject( classPtr->wc.hbrBackground );
     GlobalDeleteAtom( classPtr->atomName );
     if (HIWORD(classPtr->wc.lpszMenuName))
-#ifdef WINELIB32
 	USER_HEAP_FREE( (HANDLE)classPtr->wc.lpszMenuName );
-#else
-	USER_HEAP_FREE( LOWORD(classPtr->wc.lpszMenuName) );
-#endif
     USER_HEAP_FREE( class );
     return TRUE;
 }
@@ -336,7 +332,7 @@
     CLASS *classPtr;
 
     /* FIXME: We have the find the correct hInstance */
-    dprintf_class(stddeb,"GetClassName("NPFMT",%p,%d)\n",hwnd,lpClassName,maxCount);
+    dprintf_class(stddeb,"GetClassName(%04x,%p,%d)\n",hwnd,lpClassName,maxCount);
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
     if (!(classPtr = CLASS_FindClassPtr(wndPtr->hClass))) return 0;
     
@@ -351,7 +347,7 @@
 {
     CLASS *classPtr;
 
-    dprintf_class( stddeb, "GetClassInfo: hInstance="NPFMT" className=%s\n",
+    dprintf_class( stddeb, "GetClassInfo: hInstance=%04x className=%s\n",
 		   hInstance,
                    HIWORD(name) ? (char *)PTR_SEG_TO_LIN(name) : "(int)" );
 
diff --git a/windows/dce.c b/windows/dce.c
index 4974a2e..3ff9f54 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -108,26 +108,25 @@
         return FALSE;
     }
 
-    while (wndPtr->hwndParent)
+    while (wndPtr->parent)
     {
-	WND *parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-        if (!(parentPtr->dwStyle & WS_VISIBLE) ||
-            (parentPtr->flags & WIN_NO_REDRAW) ||
-            (parentPtr->dwStyle & WS_ICONIC))
+        wndPtr = wndPtr->parent;
+        if (!(wndPtr->dwStyle & WS_VISIBLE) ||
+            (wndPtr->flags & WIN_NO_REDRAW) ||
+            (wndPtr->dwStyle & WS_ICONIC))
         {
             SetRectEmpty( lprect );  /* Clip everything */
             return FALSE;
         }
-	xoffset += parentPtr->rectClient.left;
-	yoffset += parentPtr->rectClient.top;
-	OffsetRect( lprect, parentPtr->rectClient.left,
-		    parentPtr->rectClient.top );
+	xoffset += wndPtr->rectClient.left;
+	yoffset += wndPtr->rectClient.top;
+	OffsetRect( lprect, wndPtr->rectClient.left,
+		    wndPtr->rectClient.top );
 
 	  /* Warning!! we assume that IntersectRect() handles the case */
 	  /* where the destination is the same as one of the sources.  */
-	if (!IntersectRect( lprect, lprect, &parentPtr->rectClient ))
+	if (!IntersectRect( lprect, lprect, &wndPtr->rectClient ))
             return FALSE;  /* Visible rectangle is empty */
-	wndPtr = parentPtr;
     }
     OffsetRect( lprect, -xoffset, -yoffset );
     return TRUE;
@@ -143,30 +142,28 @@
  * is destroyed.  Used to implement DCX_CLIPSIBLINGS and
  * DCX_CLIPCHILDREN styles.
  */
-static HRGN DCE_ClipWindows( HWND hwndStart, HWND hwndEnd,
+static HRGN DCE_ClipWindows( WND *pWndStart, WND *pWndEnd,
                              HRGN hrgn, int xoffset, int yoffset )
 {
     HRGN hrgnNew;
-    WND *wndPtr;
 
-    if (!hwndStart) return hrgn;
+    if (!pWndStart) return hrgn;
     if (!(hrgnNew = CreateRectRgn( 0, 0, 0, 0 )))
     {
         DeleteObject( hrgn );
         return 0;
     }
-    for (; hwndStart != hwndEnd; hwndStart = wndPtr->hwndNext)
+    for (; pWndStart != pWndEnd; pWndStart = pWndStart->next)
     {
-        wndPtr = WIN_FindWndPtr( hwndStart );
-        if (!(wndPtr->dwStyle & WS_VISIBLE)) continue;
-        SetRectRgn( hrgnNew, wndPtr->rectWindow.left + xoffset,
-                    wndPtr->rectWindow.top + yoffset,
-                    wndPtr->rectWindow.right + xoffset,
-                    wndPtr->rectWindow.bottom + yoffset );
+        if (!(pWndStart->dwStyle & WS_VISIBLE)) continue;
+        SetRectRgn( hrgnNew, pWndStart->rectWindow.left + xoffset,
+                    pWndStart->rectWindow.top + yoffset,
+                    pWndStart->rectWindow.right + xoffset,
+                    pWndStart->rectWindow.bottom + yoffset );
         if (!CombineRgn( hrgn, hrgn, hrgnNew, RGN_DIFF )) break;
     }
     DeleteObject( hrgnNew );
-    if (hwndStart != hwndEnd)  /* something went wrong */
+    if (pWndStart != pWndEnd)  /* something went wrong */
     {
         DeleteObject( hrgn );
         return 0;
@@ -207,7 +204,7 @@
             yoffset = wndPtr->rectClient.top - wndPtr->rectWindow.top;
         }
         else xoffset = yoffset = 0;
-        hrgn = DCE_ClipWindows( wndPtr->hwndChild, 0, hrgn, xoffset, yoffset );
+        hrgn = DCE_ClipWindows( wndPtr->child, NULL, hrgn, xoffset, yoffset );
         if (!hrgn) return 0;
     }
 
@@ -225,8 +222,8 @@
     }
     if (flags & DCX_CLIPSIBLINGS)
     {
-        hrgn = DCE_ClipWindows( GetWindow( wndPtr->hwndParent, GW_CHILD ),
-                                hwnd, hrgn, xoffset, yoffset );
+        hrgn = DCE_ClipWindows( wndPtr->parent ? wndPtr->parent->child : NULL,
+                                wndPtr, hrgn, xoffset, yoffset );
         if (!hrgn) return 0;
     }
 
@@ -234,12 +231,11 @@
 
     while (wndPtr->dwStyle & WS_CHILD)
     {
-        hwnd = wndPtr->hwndParent;
-        wndPtr = WIN_FindWndPtr( hwnd );
+        wndPtr = wndPtr->parent;
         xoffset -= wndPtr->rectClient.left;
         yoffset -= wndPtr->rectClient.top;
-        hrgn = DCE_ClipWindows( GetWindow( wndPtr->hwndParent, GW_CHILD ),
-                                hwnd, hrgn, xoffset, yoffset );
+        hrgn = DCE_ClipWindows( wndPtr->parent->child, wndPtr,
+                                hrgn, xoffset, yoffset );
         if (!hrgn) return 0;
     }
     return hrgn;
@@ -275,7 +271,7 @@
         }
         while (!wndPtr->window)
         {
-            wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+            wndPtr = wndPtr->parent;
             dc->w.DCOrgX += wndPtr->rectClient.left;
             dc->w.DCOrgY += wndPtr->rectClient.top;
         }
@@ -354,12 +350,12 @@
     {
         if (flags & DCX_PARENTCLIP)  /* Get a VisRgn for the parent */
         {
-            WND *parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+            WND *parentPtr = wndPtr->parent;
             DWORD newflags = flags & ~(DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN |
                                        DCX_WINDOW);
             if (parentPtr->dwStyle & WS_CLIPSIBLINGS)
                 newflags |= DCX_CLIPSIBLINGS;
-            hrgnVisible = DCE_GetVisRgn( wndPtr->hwndParent, newflags );
+            hrgnVisible = DCE_GetVisRgn( parentPtr->hwndSelf, newflags );
             if (flags & DCX_WINDOW)
                 OffsetRgn( hrgnVisible, -wndPtr->rectWindow.left,
                                         -wndPtr->rectWindow.top );
@@ -384,7 +380,7 @@
     SelectVisRgn( hdc, hrgnVisible );
     DeleteObject( hrgnVisible );
 
-    dprintf_dc(stddeb, "GetDCEx("NPFMT","NPFMT",0x%lx): returning "NPFMT"\n", 
+    dprintf_dc(stddeb, "GetDCEx(%04x,%04x,0x%lx): returning %04x\n", 
 	       hwnd, hrgnClip, flags, hdc);
     return hdc;
 }
@@ -424,7 +420,7 @@
     HANDLE hdce;
     DCE * dce = NULL;
     
-    dprintf_dc(stddeb, "ReleaseDC: "NPFMT" "NPFMT"\n", hwnd, hdc );
+    dprintf_dc(stddeb, "ReleaseDC: %04x %04x\n", hwnd, hdc );
         
     for (hdce = firstDCE; (hdce); hdce = dce->hNext)
     {
diff --git a/windows/defdlg.c b/windows/defdlg.c
index 90a0a6d..9191ba8 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -3,8 +3,7 @@
  *
  * Copyright 1993 Alexandre Julliard
  *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
-*/
+ */
 
 #include "windows.h"
 #include "dialog.h"
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 4e1d060..530c5e5 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -122,7 +122,7 @@
     case WM_MOUSEACTIVATE:
 	if (wndPtr->dwStyle & WS_CHILD)
 	{
-	    LONG ret = SendMessage( wndPtr->hwndParent, WM_MOUSEACTIVATE,
+	    LONG ret = SendMessage( wndPtr->parent->hwndSelf, WM_MOUSEACTIVATE,
 				    wParam, lParam );
 	    if (ret) return ret;
 	}
@@ -251,7 +251,8 @@
 
     case WM_SETCURSOR:
 	if (wndPtr->dwStyle & WS_CHILD)
-	    if (SendMessage(wndPtr->hwndParent, WM_SETCURSOR, wParam, lParam))
+	    if (SendMessage(wndPtr->parent->hwndSelf, WM_SETCURSOR,
+                            wParam, lParam))
 		return TRUE;
 	return NC_HandleSetCursor( hwnd, wParam, lParam );
 
@@ -300,7 +301,7 @@
     case WM_SHOWWINDOW:
 	if( !lParam ) return 0; /* sent from ShowWindow */
 
-	if( !(wndPtr->dwStyle & WS_POPUP) || !wndPtr->hwndOwner ) 
+	if( !(wndPtr->dwStyle & WS_POPUP) || !wndPtr->owner ) 
 	      return 0;
 
 	if( wndPtr->dwStyle & WS_VISIBLE )
diff --git a/windows/dialog.c b/windows/dialog.c
index 90bb72a..793cffb 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -3,8 +3,7 @@
  *
  * Copyright 1993, 1994 Alexandre Julliard
  *
-static char Copyright[] = "Copyright  Alexandre Julliard, 1993, 1994";
-*/
+ */
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -59,16 +58,10 @@
  */
 HWND DIALOG_GetFirstTabItem( HWND hwndDlg )
 {
-    HWND hwnd;
-    WND *wndPtr = WIN_FindWndPtr( hwndDlg );
-    hwnd = wndPtr->hwndChild;
-    while(hwnd)
-    {
-        wndPtr = WIN_FindWndPtr( hwnd );
-        if (wndPtr->dwStyle & WS_TABSTOP) break;
-        hwnd = wndPtr->hwndNext;
-    }
-    return hwnd;
+    WND *pWnd = WIN_FindWndPtr( hwndDlg );
+    for (pWnd = pWnd->child; pWnd; pWnd = pWnd->next)
+        if (pWnd->dwStyle & WS_TABSTOP) return pWnd->hwndSelf;
+    return 0;
 }
 
 
@@ -218,8 +211,8 @@
     HGLOBAL hmem;
     SEGPTR data;
 
-    dprintf_dialog(stddeb, "CreateDialogParam: "NPFMT","SPFMT","NPFMT",%08lx,%ld\n",
-	    hInst, dlgTemplate, owner, (DWORD)dlgProc, param );
+    dprintf_dialog(stddeb, "CreateDialogParam: %04x,%08lx,%04x,%08lx,%ld\n",
+                   hInst, (DWORD)dlgTemplate, owner, (DWORD)dlgProc, param );
      
     if (!(hRsrc = FindResource( hInst, dlgTemplate, RT_DIALOG ))) return 0;
     if (!(hmem = LoadResource( hInst, hRsrc ))) return 0;
@@ -411,7 +404,7 @@
                                       header->y * yUnit / 8,
                                       header->cx * xUnit / 4,
                                       header->cy * yUnit / 8,
-                                      hwnd, (HMENU)((DWORD)header->id),
+                                      hwnd, (HMENU)header->id,
                                       dlgInfo->hDialogHeap, (SEGPTR)0 );
 	}
 	else
@@ -422,7 +415,7 @@
                                       header->y * yUnit / 8,
                                       header->cx * xUnit / 4,
                                       header->cy * yUnit / 8,
-                                      hwnd, (HMENU)((DWORD)header->id),
+                                      hwnd, (HMENU)header->id,
                                       hInst, (SEGPTR)0 );
 	}
 
@@ -523,8 +516,8 @@
 {
     HWND hwnd;
     
-    dprintf_dialog(stddeb, "DialogBoxParam: "NPFMT","SPFMT","NPFMT",%08lx,%ld\n",
-	    hInst, dlgTemplate, owner, (DWORD)dlgProc, param );
+    dprintf_dialog(stddeb, "DialogBoxParam: %04x,%08lx,%04x,%08lx,%ld\n",
+                   hInst, (DWORD)dlgTemplate, owner, (DWORD)dlgProc, param );
     hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param );
     if (hwnd) return DIALOG_DoDialogBox( hwnd, owner );
     return -1;
@@ -567,7 +560,7 @@
     DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
     dlgInfo->msgResult = retval;
     dlgInfo->fEnd = TRUE;
-    dprintf_dialog(stddeb, "EndDialog: "NPFMT" %d\n", hwnd, retval );
+    dprintf_dialog(stddeb, "EndDialog: %04x %d\n", hwnd, retval );
     return TRUE;
 }
 
@@ -698,18 +691,11 @@
  */
 HWND GetDlgItem( HWND hwndDlg, WORD id )
 {
-    HWND curChild;
-    WND * childPtr;
-    WND * wndPtr;
+    WND *pWnd;
 
-    if (!(wndPtr = WIN_FindWndPtr( hwndDlg ))) return 0;
-    curChild = wndPtr->hwndChild;
-    while(curChild)
-    {
-	childPtr = WIN_FindWndPtr( curChild );
-	if (childPtr->wIDmenu == id) return curChild;
-	curChild = childPtr->hwndNext;
-    }
+    if (!(pWnd = WIN_FindWndPtr( hwndDlg ))) return 0;
+    for (pWnd = pWnd->child; pWnd; pWnd = pWnd->next)
+        if (pWnd->wIDmenu == id) return pWnd->hwndSelf;
     return 0;
 }
 
@@ -811,25 +797,20 @@
  */
 BOOL CheckRadioButton( HWND hwndDlg, UINT firstID, UINT lastID, UINT checkID )
 {
-    HWND button = GetWindow( hwndDlg, GW_CHILD );
-    WND *wndPtr;
+    WND *pWnd = WIN_FindWndPtr( hwndDlg );
+    if (!pWnd) return FALSE;
 
-    while (button)
-    {
-	if (!(wndPtr = WIN_FindWndPtr( button ))) return FALSE;
-        if ((wndPtr->wIDmenu == firstID) || (wndPtr->wIDmenu == lastID)) break;
-	button = wndPtr->hwndNext;
-    }
-    if (!button) return FALSE;
+    for (pWnd = pWnd->child; pWnd; pWnd = pWnd->next)
+        if ((pWnd->wIDmenu == firstID) || (pWnd->wIDmenu == lastID)) break;
+    if (!pWnd) return FALSE;
 
-    if (wndPtr->wIDmenu == lastID)
+    if (pWnd->wIDmenu == lastID)
         lastID = firstID;  /* Buttons are in reverse order */
-    while (button)
+    while (pWnd)
     {
-	if (!(wndPtr = WIN_FindWndPtr( button ))) return FALSE;
-	SendMessage( button, BM_SETCHECK, (wndPtr->wIDmenu == checkID), 0 );
-        if (wndPtr->wIDmenu == lastID) break;
-	button = wndPtr->hwndNext;
+	SendMessage(pWnd->hwndSelf, BM_SETCHECK, (pWnd->wIDmenu == checkID),0);
+        if (pWnd->wIDmenu == lastID) break;
+	pWnd = pWnd->next;
     }
     return TRUE;
 }
@@ -865,46 +846,39 @@
  */
 HWND GetNextDlgGroupItem( HWND hwndDlg, HWND hwndCtrl, BOOL fPrevious )
 {
-    HWND hwnd, hwndStart;
-    WND * dlgPtr, * ctrlPtr, * wndPtr;
+    WND *pWnd, *pWndStart, *pWndCtrl, *pWndDlg;
 
-    if (!(dlgPtr = WIN_FindWndPtr( hwndDlg ))) return 0;
-    if (!(ctrlPtr = WIN_FindWndPtr( hwndCtrl ))) return 0;
-    if (ctrlPtr->hwndParent != hwndDlg) return 0;
+    if (!(pWndDlg = WIN_FindWndPtr( hwndDlg ))) return 0;
+    if (!(pWndCtrl = WIN_FindWndPtr( hwndCtrl ))) return 0;
+    if (pWndCtrl->parent != pWndDlg) return 0;
 
-    if (!fPrevious && ctrlPtr->hwndNext)  /*Check if next control is in group*/
+    if (!fPrevious && pWndCtrl->next)  /* Check if next control is in group */
     {
-	wndPtr = WIN_FindWndPtr( ctrlPtr->hwndNext );
-        if (!(wndPtr->dwStyle & WS_GROUP)) return ctrlPtr->hwndNext;
+        if (!(pWndCtrl->next->dwStyle & WS_GROUP))
+            return pWndCtrl->next->hwndSelf;
     }
 
       /* Now we will have to find the start of the group */
 
-    hwndStart = hwnd = dlgPtr->hwndChild;
-    while (hwnd)
+    for (pWnd = pWndStart = pWndDlg->child; pWnd; pWnd = pWnd->next)
     {
-	wndPtr = WIN_FindWndPtr( hwnd );
-        if (wndPtr->dwStyle & WS_GROUP) hwndStart = hwnd;  /*Start of a group*/
-	if (hwnd == hwndCtrl) break;
-	hwnd = wndPtr->hwndNext;
+        if (pWnd->dwStyle & WS_GROUP) pWndStart = pWnd;  /* Start of a group */
+	if (pWnd == pWndCtrl) break;
     }
 
-    if (!hwnd) fprintf(stderr, "GetNextDlgGroupItem: hwnd not in dialog!\n");
+    if (!pWnd) fprintf(stderr, "GetNextDlgGroupItem: hwnd not in dialog!\n");
 
       /* only case left for forward search: wraparound */
-    if (!fPrevious) return hwndStart;
-    
-    hwnd = hwndStart;
-    wndPtr = WIN_FindWndPtr( hwnd );
-    hwnd = wndPtr->hwndNext;
-    while (hwnd && (hwnd != hwndCtrl))
+    if (!fPrevious) return pWndStart->hwndSelf;
+
+    pWnd = pWndStart->next;
+    while (pWnd && (pWnd != pWndCtrl))
     {
-	wndPtr = WIN_FindWndPtr( hwnd );
-	if (wndPtr->dwStyle & WS_GROUP) break;
-	hwndStart = hwnd;
-	hwnd = wndPtr->hwndNext;
+        if (pWnd->dwStyle & WS_GROUP) break;
+        pWndStart = pWnd;
+        pWnd = pWnd->next;
     }
-    return hwndStart;
+    return pWndStart->hwndSelf;
 }
 
 
@@ -913,26 +887,24 @@
  */
 HWND GetNextDlgTabItem( HWND hwndDlg, HWND hwndCtrl, BOOL fPrevious )
 {
-    HWND hwnd, hwndLast;
-    WND * dlgPtr, * ctrlPtr, * wndPtr;
+    WND *pWnd, *pWndLast, *pWndCtrl, *pWndDlg;
 
-    if (!(dlgPtr = WIN_FindWndPtr( hwndDlg ))) return 0;
-    if (!(ctrlPtr = WIN_FindWndPtr( hwndCtrl ))) return 0;
-    if (ctrlPtr->hwndParent != hwndDlg) return 0;
+    if (!(pWndDlg = WIN_FindWndPtr( hwndDlg ))) return 0;
+    if (!(pWndCtrl = WIN_FindWndPtr( hwndCtrl ))) return 0;
+    if (pWndCtrl->parent != pWndDlg) return 0;
 
-    hwndLast = hwndCtrl;
-    hwnd = ctrlPtr->hwndNext;
+    pWndLast = pWndCtrl;
+    pWnd = pWndCtrl->next;
     while (1)
     {
-	if (!hwnd) hwnd = dlgPtr->hwndChild;
-	if (hwnd == hwndCtrl) break;
-	wndPtr = WIN_FindWndPtr( hwnd );
-	if ((wndPtr->dwStyle & WS_TABSTOP) && (wndPtr->dwStyle & WS_VISIBLE))
+        if (!pWnd) pWnd = pWndDlg->child;
+        if (pWnd == pWndCtrl) break;
+	if ((pWnd->dwStyle & WS_TABSTOP) && (pWnd->dwStyle & WS_VISIBLE))
 	{
-	    hwndLast = hwnd;
+            pWndLast = pWnd;
 	    if (!fPrevious) break;
 	}
-	hwnd = wndPtr->hwndNext;
+        pWnd = pWnd->next;
     }
-    return hwndLast;
+    return pWndLast->hwndSelf;
 }
diff --git a/windows/event.c b/windows/event.c
index 203f75b..eba633f 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -164,8 +164,8 @@
     XFindContext( display, ((XAnyEvent *)event)->window, winContext, &ptr );
     hwnd = (HWND) (int)ptr;
 
-    dprintf_event(stddeb, "Got event %s for hwnd "NPFMT"\n",
-		  event_names[event->type], hwnd );
+    dprintf_event(stddeb, "Got event %s for hwnd %04x\n",
+                  event_names[event->type], hwnd );
 
     switch(event->type)
     {
@@ -229,7 +229,7 @@
 	break;
 
     default:    
-	dprintf_event(stddeb, "Unprocessed event %s for hwnd "NPFMT"\n",
+	dprintf_event(stddeb, "Unprocessed event %s for hwnd %04x\n",
 	        event_names[event->type], hwnd );
 	break;
     }
@@ -522,7 +522,7 @@
 
 	if (!(wndPtr = WIN_FindWndPtr( hwnd )))
 	{
-	    dprintf_event(stddeb, "ConfigureNotify: invalid HWND "NPFMT"\n", hwnd);
+	    dprintf_event(stddeb,"ConfigureNotify: invalid HWND %04x\n",hwnd);
 	    return;
 	}
 	
@@ -672,7 +672,7 @@
                      GrabModeAsync, GrabModeAsync,
                      None, None, CurrentTime ) == GrabSuccess)
     {
-	dprintf_win(stddeb, "SetCapture: "NPFMT"\n", hwnd);
+	dprintf_win(stddeb, "SetCapture: %04x\n", hwnd);
 	captureWnd   = hwnd;
 	return old_capture_wnd;
     }
diff --git a/windows/focus.c b/windows/focus.c
index bbd591b..12f3cc9 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -68,8 +68,8 @@
  */
 HWND SetFocus(HWND hwnd)
 {
-    HWND hWndPrevFocus, hwndTop;
-    WND *wndPtr = WIN_FindWndPtr( hwndTop = hwnd );
+    HWND hWndPrevFocus, hwndTop = hwnd;
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
 
     if (wndPtr)
     {
@@ -79,11 +79,8 @@
 	{
 	    if ( wndPtr->dwStyle & ( WS_MINIMIZE | WS_DISABLED) )
 		 return 0;
-
-	    hwndTop = wndPtr->hwndParent;
-	    wndPtr  = WIN_FindWndPtr( hwndTop );
-	    if ( !wndPtr )
-	         return 0;
+            if (!(wndPtr = wndPtr->parent)) return 0;
+	    hwndTop = wndPtr->hwndSelf;
 	}
 
 	if( hwnd == hwndFocus ) return hwnd;
diff --git a/windows/graphics.c b/windows/graphics.c
index ab5cdcc..ba65dbe 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -967,7 +967,7 @@
     RECT rect;
     DC *dc;
 
-    dprintf_graphics( stddeb, "ExtFloodFill "NPFMT" %d,%d %06lx %d\n",
+    dprintf_graphics( stddeb, "ExtFloodFill %04x %d,%d %06lx %d\n",
                       hdc, x, y, color, fillType );
     dc = (DC *) GDI_GetObjPtr(hdc, DC_MAGIC);
     if (!dc) 
diff --git a/windows/hook.c b/windows/hook.c
index 1151e14..dc25685 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -71,7 +71,7 @@
     if ((id < WH_FIRST_HOOK) || (id > WH_LAST_HOOK)) return 0;
     if (!(hInst = GetExePtr( hInst ))) return 0;
 
-    dprintf_hook( stddeb, "Setting hook %d: %08lx "NPFMT" "NPFMT"\n",
+    dprintf_hook( stddeb, "Setting hook %d: %08lx %04x %04x\n",
                   id, (DWORD)proc, hInst, hTask );
 
     if (hTask)  /* Task-specific hook */
@@ -84,7 +84,7 @@
     if (id == WH_JOURNALPLAYBACK || id == WH_CBT ||
         id == WH_DEBUG || id == WH_SHELL)
     {
-	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,"NPFMT","NPFMT")!\n",
+	fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,%04x,%04x)!\n",
                  id, (DWORD)proc, hInst, hTask );
     }
 
@@ -97,7 +97,7 @@
     data->ownerQueue  = hQueue;
     data->ownerModule = hInst;
     data->inHookProc  = 0;
-    dprintf_hook( stddeb, "Setting hook %d: ret="NPFMT"\n", id, handle );
+    dprintf_hook( stddeb, "Setting hook %d: ret=%04x\n", id, handle );
 
     /* Insert it in the correct linked list */
 
@@ -126,7 +126,7 @@
     HOOKDATA *data;
     HANDLE *prevHook;
 
-    dprintf_hook( stddeb, "Removing hook "NPFMT"\n", hook );
+    dprintf_hook( stddeb, "Removing hook %04x\n", hook );
 
     if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return FALSE;
     if (data->inHookProc)
@@ -187,10 +187,10 @@
     queue->hCurHook = hook;
     data->inHookProc = 1;
 
-    dprintf_hook( stddeb, "Calling hook "NPFMT": %d %04lx %08lx\n",
+    dprintf_hook( stddeb, "Calling hook %04x: %d %04lx %08lx\n",
                   hook, code, (DWORD)wParam, lParam );
     ret = CallHookProc( data->proc, code, wParam, lParam );
-    dprintf_hook( stddeb, "Ret hook "NPFMT" = %08lx\n", hook, ret );
+    dprintf_hook( stddeb, "Ret hook %04x = %08lx\n", hook, ret );
 
     data->inHookProc = 0;
     queue->hCurHook = prevHook;
diff --git a/windows/mapping.c b/windows/mapping.c
index 8c9f121..8fb9563 100644
--- a/windows/mapping.c
+++ b/windows/mapping.c
@@ -86,7 +86,7 @@
 	return 1;
     }
 
-    dprintf_gdi(stddeb, "SetMapMode: "NPFMT" %d\n", hdc, mode );
+    dprintf_gdi(stddeb, "SetMapMode: %04x %d\n", hdc, mode );
     
     prevMode = dc->w.MapMode;
     switch(mode)
diff --git a/windows/mdi.c b/windows/mdi.c
index 37ba8f7..f3f8000 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -32,9 +32,9 @@
 #include "stddebug.h"
 #include "debug.h"
 
-void MDI_UpdateFrameText(HWND, HWND, BOOL, LPCSTR);
-BOOL MDI_AugmentFrameMenu(MDICLIENTINFO*, HWND, HWND);
-BOOL MDI_RestoreFrameMenu(HWND, HWND);
+void MDI_UpdateFrameText(WND *, HWND, BOOL, LPCSTR);
+BOOL MDI_AugmentFrameMenu(MDICLIENTINFO*, WND *, HWND);
+BOOL MDI_RestoreFrameMenu(WND *, HWND);
 
 void ScrollChildren(HWND , UINT , WPARAM , LPARAM );
 void CalcChildScroll(HWND, WORD);
@@ -48,18 +48,11 @@
  *			MDI_GetChildByID
  */
 
-static HWND MDI_GetChildByID(WND* mdiClient,int id)
+static HWND MDI_GetChildByID(WND* wndPtr,int id)
 {
- HWND	hWnd   	    = mdiClient->hwndChild;
- WND* 	wndPtr 	    = WIN_FindWndPtr( hWnd );
-
- while( wndPtr )
-  {
-	if( wndPtr->wIDmenu == id ) return hWnd;
- 	wndPtr = WIN_FindWndPtr(hWnd = wndPtr->hwndNext);
-  }
-
- return 0;
+    for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
+        if (wndPtr->wIDmenu == id) return wndPtr->hwndSelf;
+    return 0;
 }
 
 /**********************************************************************
@@ -163,37 +156,32 @@
  */
 HWND MDI_GetWindow(WND  *clientWnd, HWND hWnd, WORD wTo )
 {
- HWND            hWndNext;
- MDICLIENTINFO  *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
- WND            *wndPtr;
+    MDICLIENTINFO *clientInfo = (MDICLIENTINFO*)clientWnd->wExtra;
+    WND *wndPtr, *pWnd, *pWndLast;
+    
+    if( !hWnd ) hWnd = clientInfo->hwndActiveChild;
 
- if( !hWnd ) hWnd = clientInfo->hwndActiveChild;
+    if( !(wndPtr = WIN_FindWndPtr(hWnd)) ) return 0;
 
- if( !(wndPtr = WIN_FindWndPtr(hWnd)) ) return 0;
-
- hWndNext = hWnd;
- wTo      = wTo ? GW_HWNDPREV : GW_HWNDNEXT;
-
- while( hWndNext )
+    pWnd = wndPtr;
+    pWndLast = NULL;
+    for (;;)
     {
-        if( clientWnd->hwndChild == hWndNext && wTo == GW_HWNDPREV )
-             hWndNext = GetWindow( hWndNext, GW_HWNDLAST);
-        else if( wndPtr->hwndNext == 0 && wTo == GW_HWNDNEXT )
-                 hWndNext = clientWnd->hwndChild;
-             else
-                 hWndNext = GetWindow( hWndNext, wTo );
-	
-        wndPtr = WIN_FindWndPtr( hWndNext );
-
-        if( (wndPtr->dwStyle & WS_VISIBLE) &&
-           !(wndPtr->dwStyle & WS_DISABLED) )
-             break;
-
-        /* check if all windows were iterated through */
-        if( hWndNext == hWnd ) break;
+        pWnd = pWnd->next;
+        if (!pWnd) pWnd = wndPtr->parent->child;
+        if (pWnd == wndPtr)  /* not found */
+        {
+            if (!wTo || !pWndLast) return 0;
+            break;
+        }
+        if ((pWnd->dwStyle & WS_VISIBLE) &&
+            !(pWnd->dwStyle & WS_DISABLED))  /* found one */
+        {
+            pWndLast = pWnd;
+            if (!wTo) break;
+        }
     }
-
- return ( hWnd == hWndNext )? 0 : hWndNext;
+    return pWndLast ? pWndLast->hwndSelf : 0;
 }
 
 
@@ -205,7 +193,7 @@
     WND           *w         = WIN_FindWndPtr(hwnd);
     MDICLIENTINFO *ci;
 
-    dprintf_mdi(stddeb, "WM_MDISETMENU: "NPFMT" %04x "NPFMT" "NPFMT"\n",
+    dprintf_mdi(stddeb, "WM_MDISETMENU: %04x %04x %04x %04x\n",
                 hwnd, fRefresh, hmenuFrame, hmenuWindow);
 
     ci = (MDICLIENTINFO *) w->wExtra;
@@ -216,7 +204,7 @@
 	HMENU oldFrameMenu = GetMenu(hwndFrame);
         
 	if( ci->flagChildMaximized && hmenuFrame && hmenuFrame!=oldFrameMenu )
-	    MDI_RestoreFrameMenu(w->hwndParent, ci->flagChildMaximized );
+	    MDI_RestoreFrameMenu(w->parent, ci->flagChildMaximized );
 
 	if( hmenuWindow && hmenuWindow!=ci->hWindowMenu )
 	  {
@@ -258,8 +246,7 @@
 	  {
 	    SetMenu(hwndFrame, hmenuFrame);
 	    if( ci->flagChildMaximized )
-	        MDI_AugmentFrameMenu(ci, 
-                    w->hwndParent, ci->flagChildMaximized );
+	        MDI_AugmentFrameMenu(ci, w->parent, ci->flagChildMaximized );
 	    return oldFrameMenu;
 	  }
 
@@ -321,7 +308,7 @@
     if (hwnd)
     {
 	MDI_MenuModifyItem(w ,hwnd); 
-        dprintf_mdi(stddeb, "MDICreateChild: created child - "NPFMT"\n",hwnd);
+        dprintf_mdi(stddeb, "MDICreateChild: created child - %04x\n",hwnd);
     }
     else
     {
@@ -341,7 +328,7 @@
  WND*	childWnd = WIN_FindWndPtr(hwnd);
  RECT 	rect 	 = clientWnd->rectClient;
 
- MapWindowPoints(clientWnd->hwndParent, 
+ MapWindowPoints(clientWnd->parent->hwndSelf, 
 	       ((MDICLIENTINFO*)clientWnd->wExtra)->self, (LPPOINT)&rect, 2);
  AdjustWindowRectEx(&rect, childWnd->dwStyle, 0, childWnd->dwExStyle);
 
@@ -372,7 +359,7 @@
  
     ci = (MDICLIENTINFO *) w->wExtra;
 
-    dprintf_mdi(stddeb, "MDI_SwitchActiveChild: from "NPFMT", to "NPFMT"\n",childHwnd,hwndTo);
+    dprintf_mdi(stddeb, "MDI_SwitchActiveChild: from %04x, to %04x\n",childHwnd,hwndTo);
 
     if ( !hwndTo ) return; 
 
@@ -421,9 +408,9 @@
 		ShowWindow( child, SW_HIDE);
 		if( child == ci->flagChildMaximized )
 		  {
-		    MDI_RestoreFrameMenu(w_parent->hwndParent, child);
+		    MDI_RestoreFrameMenu(w_parent->parent, child);
 		    ci->flagChildMaximized = 0;
-		    MDI_UpdateFrameText(w_parent->hwndParent,parent,TRUE,NULL);
+		    MDI_UpdateFrameText(w_parent->parent,parent,TRUE,NULL);
 		  }
 
                 MDI_ChildActivate(w_parent,0);
@@ -433,7 +420,7 @@
 	
         ci->nActiveChildren--;
 
-        dprintf_mdi(stddeb,"MDIDestroyChild: child destroyed - "NPFMT"\n",child);
+        dprintf_mdi(stddeb,"MDIDestroyChild: child destroyed - %04x\n",child);
 
         if (flagDestroy)
 	   {
@@ -465,9 +452,9 @@
     if( wndPtr )
         if( wndPtr->dwStyle & WS_DISABLED ) return 0L;
 
-    dprintf_mdi(stddeb,"MDI_ChildActivate: "NPFMT"\n", hWndChild);
+    dprintf_mdi(stddeb,"MDI_ChildActivate: %04x\n", hWndChild);
 
-    if( GetActiveWindow() == clientPtr->hwndParent )
+    if( GetActiveWindow() == clientPtr->parent->hwndSelf )
         isActiveFrameWnd = TRUE;
 	
     /* deactivate prev. active child */
@@ -550,14 +537,14 @@
 
     if (!(listTop = (MDIWCL*)malloc( sizeof(MDIWCL) ))) return NULL;
 
-    listTop->hChild = clientWnd->hwndChild;
+    listTop->hChild = clientWnd->child ? clientWnd->child->hwndSelf : 0;
     listTop->prev   = NULL;
     *iTotal 	    = 1;
 
     /* build linked list from top child to bottom */
 
     childWnd  =  WIN_FindWndPtr( listTop->hChild );
-    while( childWnd && childWnd->hwndNext )
+    while( childWnd && childWnd->next )
     {
 	listNext = (MDIWCL*)xmalloc(sizeof(MDIWCL));
 	
@@ -569,12 +556,12 @@
 	    (*iTotal)--;
 	}
 
-	listNext->hChild = childWnd->hwndNext;
+	listNext->hChild = childWnd->next->hwndSelf;
 	listNext->prev   = listTop;
 	listTop          = listNext;
 	(*iTotal)++;
 
-	childWnd  =  WIN_FindWndPtr( childWnd->hwndNext );
+	childWnd  =  childWnd->next;
     }
 
     if( (childWnd->dwStyle & WS_DISABLED) ||
@@ -641,10 +628,8 @@
     ysize   = rect.bottom - 8 * spacing;
     xsize   = rect.right  - 8 * spacing;
     
-    dprintf_mdi(stddeb, 
-      "MDICascade: Client wnd at (%ld,%ld) - (%ld,%ld), spacing %d\n", 
-      (LONG)rect.left, (LONG)rect.top, (LONG)rect.right, (LONG)rect.bottom,
-      spacing);
+    dprintf_mdi(stddeb, "MDICascade: Client wnd at (%d,%d) - (%d,%d), spacing %d\n", 
+                rect.left, rect.top, rect.right, rect.bottom, spacing);
     
     clientWnd =  WIN_FindWndPtr( parent );
 
@@ -658,7 +643,7 @@
     /* walk list and move windows */
     while ( listTop )
     {
-	dprintf_mdi(stddeb, "MDICascade: move "NPFMT" to (%d,%d) size [%d,%d]\n", 
+	dprintf_mdi(stddeb, "MDICascade: move %04x to (%d,%d) size [%d,%d]\n", 
 		listTop->hChild, x, y, xsize, ysize);
 
 	if( listTop->hChild )
@@ -786,19 +771,18 @@
 /**********************************************************************
  *					MDI_AugmentFrameMenu
  */
-BOOL MDI_AugmentFrameMenu(MDICLIENTINFO* ci, HWND hFrame, HWND hChild)
+BOOL MDI_AugmentFrameMenu(MDICLIENTINFO* ci, WND *frame, HWND hChild)
 {
- WND*	frame = WIN_FindWndPtr(hFrame);
  WND*	child = WIN_FindWndPtr(hChild);
  HMENU  hSysPopup = 0;
 
- dprintf_mdi(stddeb,"MDI_AugmentFrameMenu: frame "NPFMT",child "NPFMT"\n",hFrame,hChild);
+ dprintf_mdi(stddeb,"MDI_AugmentFrameMenu: frame %p,child %04x\n",frame,hChild);
 
  if( !frame->wIDmenu || !child->hSysMenu ) return 0; 
  
  hSysPopup = GetSystemMenu(hChild,FALSE);
 
- dprintf_mdi(stddeb,"got popup "NPFMT"\n in sysmenu "NPFMT"",hSysPopup,child->hSysMenu);
+ dprintf_mdi(stddeb,"got popup %04x\n in sysmenu %04x",hSysPopup,child->hSysMenu);
  
  if( !InsertMenu(frame->wIDmenu,0,MF_BYPOSITION | MF_BITMAP | MF_POPUP,
                  hSysPopup, (SEGPTR)(DWORD)ci->obmClose) )
@@ -818,7 +802,7 @@
  child->dwStyle &= ~WS_SYSMENU;
 
  /* redraw frame */
- SetWindowPos(hFrame, 0,0,0,0,0, SWP_FRAMECHANGED | SWP_NOSIZE | 
+ SetWindowPos(frame->hwndSelf, 0,0,0,0,0, SWP_FRAMECHANGED | SWP_NOSIZE | 
                                  SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER );
 
  return 1;
@@ -827,13 +811,12 @@
 /**********************************************************************
  *					MDI_RestoreFrameMenu
  */
-BOOL MDI_RestoreFrameMenu(HWND hFrame, HWND hChild)
+BOOL MDI_RestoreFrameMenu( WND *frameWnd, HWND hChild)
 {
- WND*	frameWnd = WIN_FindWndPtr(hFrame);
  WND*   child    = WIN_FindWndPtr(hChild);
  INT	nItems   = GetMenuItemCount(frameWnd->wIDmenu) - 1;
 
- dprintf_mdi(stddeb,"MDI_RestoreFrameMenu: for child "NPFMT"\n",hChild);
+ dprintf_mdi(stddeb,"MDI_RestoreFrameMenu: for child %04x\n",hChild);
 
  if( GetMenuItemID(frameWnd->wIDmenu,nItems) != SC_RESTORE )
      return 0; 
@@ -856,12 +839,11 @@
  *
  * Note: lpTitle can be NULL
  */
-void MDI_UpdateFrameText(HWND hFrame, HWND hClient, BOOL repaint, LPCSTR lpTitle)
+void MDI_UpdateFrameText(WND *frameWnd, HWND hClient, BOOL repaint, LPCSTR lpTitle)
 {
  char   lpBuffer[MDI_MAXTITLELENGTH+1];
  LPSTR	lpText    = NULL;
  WND* 	clientWnd = WIN_FindWndPtr(hClient);
- WND* 	frameWnd  = WIN_FindWndPtr(hFrame);
 
  MDICLIENTINFO *ci = (MDICLIENTINFO *) clientWnd->wExtra;
 
@@ -934,8 +916,8 @@
      XStoreName( display, frameWnd->window, lpBuffer );
 
  if( repaint == MDI_REPAINTFRAME)
-     SetWindowPos(hFrame, 0,0,0,0,0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE |
-                                     SWP_NOACTIVATE | SWP_NOZORDER );
+     SetWindowPos(frameWnd->hwndSelf, 0,0,0,0,0, SWP_FRAMECHANGED |
+                  SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER );
 }
 
 
@@ -954,7 +936,7 @@
     MDICLIENTINFO       *ci;
     RECT		 rect;
     WND                 *w 	  = WIN_FindWndPtr(hwnd);
-    WND			*frameWnd = WIN_FindWndPtr( w->hwndParent );
+    WND			*frameWnd = w->parent;
 
     ci = (MDICLIENTINFO *) w->wExtra;
     
@@ -976,21 +958,20 @@
 	w->dwStyle             |= WS_CLIPCHILDREN;
 	frameWnd->hText		= 0;	/* will be restored in UpdateFrameText */
 
-	MDI_UpdateFrameText( w->hwndParent, hwnd, MDI_NOFRAMEREPAINT, NULL);
+	MDI_UpdateFrameText( frameWnd, hwnd, MDI_NOFRAMEREPAINT, NULL);
 
 	AppendMenu(ccs->hWindowMenu,MF_SEPARATOR,0,(SEGPTR)0);
 
-	GetClientRect(w->hwndParent, &rect);
+	GetClientRect(frameWnd->hwndSelf, &rect);
 	NC_HandleNCCalcSize(hwnd, (NCCALCSIZE_PARAMS*) &rect);
 	w->rectClient = rect;
 
-	dprintf_mdi(stddeb,"MDI: Client created - hwnd = "NPFMT", idFirst = %u\n",hwnd,ci->idFirstChild);
+	dprintf_mdi(stddeb,"MDI: Client created - hwnd = %04x, idFirst = %u\n",hwnd,ci->idFirstChild);
 
 	return 0;
       
       case WM_DESTROY:
-	if( ci->flagChildMaximized )
-	  MDI_RestoreFrameMenu(hwnd, w->hwndParent);
+	if( ci->flagChildMaximized ) MDI_RestoreFrameMenu(w, frameWnd->hwndSelf);
 
 	if(ci->obmClose)   DeleteObject(ci->obmClose);
 	if(ci->obmRestore) DeleteObject(ci->obmRestore);
@@ -1164,7 +1145,7 @@
 	    break;
 
 	  case WM_SETTEXT:
-	    MDI_UpdateFrameText(hwnd, hwndMDIClient, 
+	    MDI_UpdateFrameText(WIN_FindWndPtr(hwnd), hwndMDIClient, 
 				      MDI_REPAINTFRAME, 
 			             (LPCSTR)PTR_SEG_TO_LIN(lParam));
 	    return 0;
@@ -1205,7 +1186,7 @@
 	DefWindowProc(hwnd, message, wParam, lParam);
 	MDI_MenuModifyItem(clientWnd,hwnd);
 	if( ci->flagChildMaximized == hwnd )
-	    MDI_UpdateFrameText( clientWnd->hwndParent, ci->self,
+	    MDI_UpdateFrameText( clientWnd->parent, ci->self,
 				 MDI_REPAINTFRAME, NULL );
         return 0;
 
@@ -1223,7 +1204,7 @@
 	return 0;
 
       case WM_NCPAINT:
-	dprintf_mdi(stddeb,"DefMDIChildProc: WM_NCPAINT for "NPFMT", active "NPFMT"\n",
+	dprintf_mdi(stddeb,"DefMDIChildProc: WM_NCPAINT for %04x, active %04x\n",
 					     hwnd, ci->hwndActiveChild );
 	break;
 
@@ -1235,7 +1216,8 @@
 		     break;
 		case SC_MAXIMIZE:
 		     if( ci->flagChildMaximized == hwnd) 
-			 return SendMessage( clientWnd->hwndParent, message, wParam, lParam);
+			 return SendMessage( clientWnd->parent->hwndSelf,
+                                             message, wParam, lParam);
 		     break;
 		case SC_NEXTWINDOW:
 		     SendMessage( ci->self, WM_MDINEXT, 0, 0);
@@ -1265,8 +1247,8 @@
 	  {
   	    ci->flagChildMaximized = 0;
 	    
-	    MDI_RestoreFrameMenu( clientWnd->hwndParent, hwnd);
-            MDI_UpdateFrameText( clientWnd->hwndParent, ci->self,
+	    MDI_RestoreFrameMenu( clientWnd->parent, hwnd);
+            MDI_UpdateFrameText( clientWnd->parent, ci->self,
                                  MDI_REPAINTFRAME, NULL );
 	  }
 
@@ -1280,7 +1262,7 @@
 	      {	    
 	       SendMessage( hMaxChild, WM_SETREDRAW, FALSE, 0L );
 
-	       MDI_RestoreFrameMenu( clientWnd->hwndParent, hMaxChild);
+	       MDI_RestoreFrameMenu( clientWnd->parent, hMaxChild);
 	       ShowWindow( hMaxChild, SW_SHOWNOACTIVATE);
 
 	       SendMessage( hMaxChild, WM_SETREDRAW, TRUE, 0L );
@@ -1288,8 +1270,8 @@
 
 	    ci->flagChildMaximized = hwnd; /* !!! */
 
-	    MDI_AugmentFrameMenu( ci, clientWnd->hwndParent, hwnd);
-	    MDI_UpdateFrameText( clientWnd->hwndParent, ci->self,
+	    MDI_AugmentFrameMenu( ci, clientWnd->parent, hwnd);
+	    MDI_UpdateFrameText( clientWnd->parent, ci->self,
 				 MDI_REPAINTFRAME, NULL ); 
 	  }
 
@@ -1352,7 +1334,7 @@
 	     return 0;
       }
 
-  dprintf_mdi(stddeb,"TranslateMDISysAccel: wParam = "NPFMT"\n", wParam);
+  dprintf_mdi(stddeb,"TranslateMDISysAccel: wParam = %04x\n", wParam);
 
   SendMessage(ci->hwndActiveChild,WM_SYSCOMMAND, wParam, (LPARAM)msg->wParam);
   return 1;
@@ -1365,17 +1347,13 @@
 void CalcChildScroll( HWND hwnd, WORD scroll )
 {
     RECT childRect, clientRect;
-    HWND hwndChild;
+    WND *pWnd;
 
+    if (!(pWnd = WIN_FindWndPtr( hwnd ))) return;
     GetClientRect( hwnd, &clientRect );
     SetRectEmpty( &childRect );
-    hwndChild = GetWindow( hwnd, GW_CHILD );
-    while (hwndChild)
-    {
-        WND *wndPtr = WIN_FindWndPtr( hwndChild );
-        UnionRect( &childRect, &wndPtr->rectWindow, &childRect );
-        hwndChild = wndPtr->hwndNext;
-    }
+    for (pWnd = pWnd->child; pWnd; pWnd = pWnd->next)
+        UnionRect( &childRect, &pWnd->rectWindow, &childRect );
     UnionRect( &childRect, &clientRect, &childRect );
 
     if ((scroll == SB_HORZ) || (scroll == SB_BOTH))
diff --git a/windows/message.c b/windows/message.c
index 8f00ed8..415f39c 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -50,6 +50,7 @@
  */
 static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove )
 {
+    WND *pWnd;
     BOOL eatMsg = FALSE;
     INT hittest;
     static DWORD lastClickTime = 0;
@@ -75,9 +76,10 @@
                                 msg->message, (LPARAM)MAKE_SEGPTR(&hook));
     }
    
-    if ((hittest = WINPOS_WindowFromPoint( msg->pt, &msg->hwnd )) != HTERROR)
+    hittest = WINPOS_WindowFromPoint( msg->pt, &pWnd );
+    msg->hwnd = pWnd->hwndSelf;
+    if (hittest != HTERROR)
     {
-
         /* Send the WM_PARENTNOTIFY message */
 
         if (mouseClick) WIN_SendParentNotify( msg->hwnd, msg->message, 0,
@@ -126,9 +128,7 @@
 	if (dbl_click && (hittest == HTCLIENT))
 	{
 	    /* Check whether window wants the double click message. */
-	    WND * wndPtr = WIN_FindWndPtr( msg->hwnd );
-            if (!wndPtr || !(WIN_CLASS_STYLE(wndPtr) & CS_DBLCLKS))
-                dbl_click = FALSE;
+            dbl_click = (WIN_CLASS_STYLE(pWnd) & CS_DBLCLKS) != 0;
 	}
 
 	if (dbl_click) switch(msg->message)
@@ -576,20 +576,20 @@
        return TRUE;
 #endif  /* CONFIG_IPC */
     
-    if (hwnd == HWND_BROADCAST) {
-      dprintf_msg(stddeb,"PostMessage // HWND_BROADCAST !\n");
-      hwnd = GetTopWindow(GetDesktopWindow());
-      while (hwnd) {
-	if (!(wndPtr = WIN_FindWndPtr(hwnd))) break;
-	if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION) {
-	  dprintf_msg(stddeb,"BROADCAST Message to hWnd="NPFMT" m=%04X w=%04X l=%08lX !\n",
-		      hwnd, message, wParam, lParam);
-	  PostMessage(hwnd, message, wParam, lParam);
-	}
-	hwnd = wndPtr->hwndNext;
-      }
-      dprintf_msg(stddeb,"PostMessage // End of HWND_BROADCAST !\n");
-      return TRUE;
+    if (hwnd == HWND_BROADCAST)
+    {
+        dprintf_msg(stddeb,"PostMessage // HWND_BROADCAST !\n");
+        for (wndPtr = WIN_GetDesktop()->child; wndPtr; wndPtr = wndPtr->next)
+        {
+            if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION)
+            {
+                dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04x m=%04X w=%04X l=%08lX !\n",
+                            wndPtr->hwndSelf, message, wParam, lParam);
+                PostMessage( wndPtr->hwndSelf, message, wParam, lParam );
+            }
+        }
+        dprintf_msg(stddeb,"PostMessage // End of HWND_BROADCAST !\n");
+        return TRUE;
     }
 
     wndPtr = WIN_FindWndPtr( hwnd );
@@ -641,17 +641,14 @@
     if (hwnd == HWND_BROADCAST)
     {
         dprintf_msg(stddeb,"SendMessage // HWND_BROADCAST !\n");
-        hwnd = GetTopWindow(GetDesktopWindow());
-        while (hwnd)
-	{
-            if (!(wndPtr = WIN_FindWndPtr(hwnd))) break;
+        for (wndPtr = WIN_GetDesktop()->child; wndPtr; wndPtr = wndPtr->next)
+        {
             if (wndPtr->dwStyle & WS_POPUP || wndPtr->dwStyle & WS_CAPTION)
             {
-                dprintf_msg(stddeb,"BROADCAST Message to hWnd="NPFMT" m=%04X w=%04lX l=%08lX !\n",
-                            hwnd, msg, (DWORD)wParam, lParam);
-                 ret |= SendMessage( hwnd, msg, wParam, lParam );
+                dprintf_msg(stddeb,"BROADCAST Message to hWnd=%04x m=%04X w=%04lX l=%08lX !\n",
+                            wndPtr->hwndSelf, msg, (DWORD)wParam, lParam);
+                ret |= SendMessage( wndPtr->hwndSelf, msg, wParam, lParam );
 	    }
-            hwnd = wndPtr->hwndNext;
         }
         dprintf_msg(stddeb,"SendMessage // End of HWND_BROADCAST !\n");
         return TRUE;
@@ -732,7 +729,7 @@
     {
 	if (msg->lParam)
         {
-#ifndef WINELIB32
+#ifndef WINELIB
             HINSTANCE ds = msg->hwnd ? WIN_GetWindowInstance( msg->hwnd )
                                      : (HINSTANCE)CURRENT_DS;
 #endif
@@ -753,7 +750,7 @@
     if (painting && (wndPtr = WIN_FindWndPtr( msg->hwnd )) &&
         (wndPtr->flags & WIN_NEEDS_BEGINPAINT) && wndPtr->hrgnUpdate)
     {
-	fprintf(stderr, "BeginPaint not called on WM_PAINT for hwnd "NPFMT"!\n", 
+	fprintf(stderr, "BeginPaint not called on WM_PAINT for hwnd %04x!\n", 
 		msg->hwnd);
 	wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
         /* Validate the update region to avoid infinite WM_PAINT loop */
@@ -768,7 +765,7 @@
  */
 WORD RegisterWindowMessage( SEGPTR str )
 {
-    dprintf_msg(stddeb, "RegisterWindowMessage: '"SPFMT"'\n", str );
+    dprintf_msg(stddeb, "RegisterWindowMessage: %08lx\n", (DWORD)str );
     return GlobalAddAtom( str );
 }
 
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 917de6c..70b8125 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -110,9 +110,9 @@
 	style |= WS_CAPTION;
     if (exStyle & WS_EX_DLGMODALFRAME) style &= ~WS_THICKFRAME;
 
-    dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%ld,%ld)-(%ld,%ld) %08lx %d %08lx\n",
-      (LONG)rect->left, (LONG)rect->top, (LONG)rect->right, (LONG)rect->bottom,
-      style, menu, exStyle );
+    dprintf_nonclient(stddeb, "AdjustWindowRectEx: (%d,%d)-(%d,%d) %08lx %d %08lx\n",
+                      rect->left, rect->top, rect->right, rect->bottom,
+                      style, menu, exStyle );
 
     NC_AdjustRect( rect, style, menu, exStyle );
     return TRUE;
@@ -268,8 +268,8 @@
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return HTERROR;
 
-    dprintf_nonclient(stddeb, "NC_HandleNCHitTest: hwnd="NPFMT" pt=%ld,%ld\n",
-		      hwnd, (LONG)pt.x, (LONG)pt.y );
+    dprintf_nonclient(stddeb, "NC_HandleNCHitTest: hwnd=%04x pt=%d,%d\n",
+		      hwnd, pt.x, pt.y );
 
     GetWindowRect( hwnd, &rect );
     if (!PtInRect( &rect, pt )) return HTNOWHERE;
@@ -627,7 +627,7 @@
 
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
-    dprintf_nonclient(stddeb, "NC_DoNCPaint: "NPFMT" %d\n", hwnd, active );
+    dprintf_nonclient(stddeb, "NC_DoNCPaint: %04x %d\n", hwnd, active );
     if (!wndPtr || !(wndPtr->dwStyle & WS_VISIBLE)) return; /* Nothing to do */
 
     if (!(hdc = GetDCEx( hwnd, 0, DCX_USESTYLE | DCX_WINDOW ))) return;
@@ -826,7 +826,7 @@
 	NC_GetInsideRect( hwnd, &rect );
 	OffsetRect( &rect, wndPtr->rectWindow.left, wndPtr->rectWindow.top );
 	if (wndPtr->dwStyle & WS_CHILD)
-	    ClientToScreen( wndPtr->hwndParent, (POINT *)&rect );
+	    ClientToScreen( wndPtr->parent->hwndSelf, (POINT *)&rect );
 	rect.right = rect.left + SYSMETRICS_CXSIZE;
 	rect.bottom = rect.top + SYSMETRICS_CYSIZE;
 	if (!iconic) NC_DrawSysButton( hwnd, hdc, TRUE );
@@ -864,7 +864,7 @@
 	pt.x = wndPtr->rectWindow.left + (rect.right - rect.left) / 2;
 	pt.y = wndPtr->rectWindow.top + rect.top + SYSMETRICS_CYSIZE/2;
 	if (wndPtr->dwStyle & WS_CHILD)
-	    ClientToScreen( wndPtr->hwndParent, &pt );
+	    ClientToScreen( wndPtr->parent->hwndSelf, &pt );
 	hittest = HTCAPTION;
     }
     else  /* SC_SIZE */
@@ -969,7 +969,7 @@
     NC_GetMinMaxInfo( hwnd, NULL, NULL, &minTrack, &maxTrack );
     sizingRect = wndPtr->rectWindow;
     if (wndPtr->dwStyle & WS_CHILD)
-	GetClientRect( wndPtr->hwndParent, &mouseRect );
+	GetClientRect( wndPtr->parent->hwndSelf, &mouseRect );
     else SetRect( &mouseRect, 0, 0, SYSMETRICS_CXSCREEN, SYSMETRICS_CYSCREEN );
     if (ON_LEFT_BORDER(hittest))
     {
@@ -998,7 +998,7 @@
     if (wndPtr->dwStyle & WS_CHILD)
     {
           /* Retrieve a default cache DC (without using the window style) */
-        hdc = GetDCEx( wndPtr->hwndParent, 0, DCX_CACHE );
+        hdc = GetDCEx( wndPtr->parent->hwndSelf, 0, DCX_CACHE );
     }
     else
     {  /* Grab the server only when moving top-level windows without desktop */
@@ -1023,7 +1023,7 @@
 
 	pt = msg.pt;
 	if (wndPtr->dwStyle & WS_CHILD)
-	    ScreenToClient( wndPtr->hwndParent, &pt );
+	    ScreenToClient( wndPtr->parent->hwndSelf, &pt );
 
 	
 	if (msg.message == WM_KEYDOWN) switch(msg.wParam)
@@ -1066,7 +1066,7 @@
     NC_DrawMovingFrame( hdc, &sizingRect, thickframe );
     ReleaseCapture();
 
-    if (wndPtr->dwStyle & WS_CHILD) ReleaseDC( wndPtr->hwndParent, hdc );
+    if (wndPtr->dwStyle & WS_CHILD) ReleaseDC( wndPtr->parent->hwndSelf, hdc );
     else
     {
 	ReleaseDC( 0, hdc );
@@ -1294,10 +1294,11 @@
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
 
-    dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %lx %ld,%ld\n", 
-		      (DWORD)wParam, (LONG)pt.x, (LONG)pt.y );
+    dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %x %d,%d\n", 
+		      wParam, pt.x, pt.y );
 
-    if (wndPtr->dwStyle & WS_CHILD) ScreenToClient( wndPtr->hwndParent, &pt );
+    if (wndPtr->dwStyle & WS_CHILD)
+        ScreenToClient( wndPtr->parent->hwndSelf, &pt );
 
     switch (wParam & 0xfff0)
     {
diff --git a/windows/painting.c b/windows/painting.c
index d1438d5..bd1554c 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -49,7 +49,7 @@
     DeleteObject( hrgnUpdate );
     if (!lps->hdc)
     {
-        fprintf( stderr, "GetDCEx() failed in BeginPaint(), hwnd="NPFMT"\n", hwnd );
+        fprintf(stderr, "GetDCEx() failed in BeginPaint(), hwnd=%04x\n", hwnd);
         return 0;
     }
 
@@ -144,13 +144,13 @@
 
     if (rectUpdate)
     {
-        dprintf_win( stddeb, "RedrawWindow: "NPFMT" %ld,%ld-%ld,%ld "NPFMT" flags=%04x\n",
-                     hwnd, (LONG)rectUpdate->left, (LONG)rectUpdate->top,
-                     (LONG)rectUpdate->right, (LONG)rectUpdate->bottom, hrgnUpdate, flags);
+        dprintf_win(stddeb, "RedrawWindow: %04x %d,%d-%d,%d %04x flags=%04x\n",
+                    hwnd, rectUpdate->left, rectUpdate->top,
+                    rectUpdate->right, rectUpdate->bottom, hrgnUpdate, flags );
     }
     else
     {
-        dprintf_win( stddeb, "RedrawWindow: "NPFMT" NULL "NPFMT" flags=%04x\n",
+        dprintf_win( stddeb, "RedrawWindow: %04x NULL %04x flags=%04x\n",
                      hwnd, hrgnUpdate, flags);
     }
     GetClientRect( hwnd, &rectClient );
@@ -265,30 +265,28 @@
 	{
 	    HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 );
 	    if (!hrgn) return TRUE;
-	    for (hwnd = wndPtr->hwndChild; (hwnd); hwnd = wndPtr->hwndNext)
+	    for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
 	    {
-		if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
 		CombineRgn( hrgn, hrgnUpdate, 0, RGN_COPY );
 		OffsetRgn( hrgn, -wndPtr->rectClient.left,
 			         -wndPtr->rectClient.top );
-		RedrawWindow( hwnd, NULL, hrgn, flags );
+		RedrawWindow( wndPtr->hwndSelf, NULL, hrgn, flags );
 	    }
 	    DeleteObject( hrgn );
 	}
 	else
 	{
 	    RECT rect;		
-	    for (hwnd = wndPtr->hwndChild; (hwnd); hwnd = wndPtr->hwndNext)
+	    for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
 	    {
-		if (!(wndPtr = WIN_FindWndPtr( hwnd ))) break;
 		if (rectUpdate)
 		{
 		    rect = *rectUpdate;
 		    OffsetRect( &rect, -wndPtr->rectClient.left,
 			               -wndPtr->rectClient.top );
-		    RedrawWindow( hwnd, &rect, 0, flags );
+		    RedrawWindow( wndPtr->hwndSelf, &rect, 0, flags );
 		}
-		else RedrawWindow( hwnd, NULL, 0, flags );
+		else RedrawWindow( wndPtr->hwndSelf, NULL, 0, flags );
 	    }
 	}
     }
diff --git a/windows/property.c b/windows/property.c
index ef6a323..6927be0 100644
--- a/windows/property.c
+++ b/windows/property.c
@@ -31,7 +31,8 @@
     PROPERTY *prop;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "SetProp: "NPFMT" "SPFMT" "NPFMT"\n", hwnd, str, hData );
+    dprintf_prop( stddeb, "SetProp: %04x %08lx %04x\n",
+                  hwnd, (DWORD)str, hData );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
     hProp = USER_HEAP_ALLOC( sizeof(PROPERTY) + 
                              (HIWORD(str) ? strlen(PTR_SEG_TO_LIN(str)) : 0 ));
@@ -62,7 +63,7 @@
     HANDLE hProp;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "GetProp: "NPFMT" "SPFMT"\n", hwnd, str );
+    dprintf_prop( stddeb, "GetProp: %04x %08lx\n", hwnd, (DWORD)str );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     hProp = wndPtr->hProp;
     while (hProp)
@@ -88,7 +89,7 @@
     HANDLE *hProp;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "RemoveProp: "NPFMT" "SPFMT"\n", hwnd, str );
+    dprintf_prop( stddeb, "RemoveProp: %04x %08lx\n", hwnd, (DWORD)str );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     hProp = &wndPtr->hProp;
     while (*hProp)
@@ -119,14 +120,14 @@
     HANDLE hProp;
     WND *wndPtr;
 
-    dprintf_prop( stddeb, "EnumProps: "NPFMT" %08lx\n", hwnd, (LONG)func );
+    dprintf_prop( stddeb, "EnumProps: %04x %08lx\n", hwnd, (LONG)func );
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
     hProp = wndPtr->hProp;
     while (hProp)
     {
         PROPERTY *prop = (PROPERTY *)USER_HEAP_LIN_ADDR(hProp);
         
-        dprintf_prop( stddeb, "  Callback: atom=%04x data="NPFMT" str='%s'\n",
+        dprintf_prop( stddeb, "  Callback: atom=%04x data=%04x str='%s'\n",
                       prop->atom, prop->hData, prop->string );
 
           /* Already get the next in case the callback */
@@ -134,7 +135,7 @@
         hProp = prop->next;
         ret = CallEnumPropProc( func, hwnd,
                                 prop->atom ? 
-				  (LONG)MAKELONG( prop->atom, 0 )
+                                  (LONG)MAKELONG( prop->atom, 0 )
 				:
                                   (LONG)(USER_HEAP_SEG_ADDR(hProp) +
                                          ((int)prop->string - (int)prop)),
diff --git a/windows/queue.c b/windows/queue.c
index 1d0028a..0606645 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -28,7 +28,7 @@
     if (!(pq = (MESSAGEQUEUE*) GlobalLock( hQueue )) ||
         GlobalSize(hQueue) < sizeof(MESSAGEQUEUE) + pq->queueSize*sizeof(QMSG))
     {
-        fprintf( stderr, NPFMT " is not a queue handle\n", hQueue );
+        fprintf( stderr, "%04x is not a queue handle\n", hQueue );
         return;
     }
 
@@ -68,7 +68,7 @@
         MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( hQueue );
         if (!queue)
         {
-            fprintf( stderr, "*** Bad queue handle "NPFMT"\n", hQueue );
+            fprintf( stderr, "*** Bad queue handle %04x\n", hQueue );
             return;
         }
         fprintf( stderr, "%04x %5d %4d %04x %s\n",
@@ -198,7 +198,7 @@
 {
     int i, pos = msgQueue->nextMessage;
 
-    dprintf_msg(stddeb,"MSG_FindMsg: hwnd=0x"NPFMT"\n\n", hwnd );
+    dprintf_msg(stddeb,"MSG_FindMsg: hwnd=%04x\n\n", hwnd );
 
     if (!msgQueue->msgCount) return -1;
     if (!hwnd && !first && !last) return pos;
diff --git a/windows/scroll.c b/windows/scroll.c
index 95a88e8..4259dbf 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -78,32 +78,26 @@
 BOOL	SCROLL_ScrollChildren( HWND hScroll, short dx, short dy)
 {
  WND           *wndPtr = WIN_FindWndPtr(hScroll);
- HWND		hWnd   = wndPtr->hwndChild;
  HRGN		hUpdateRgn;
  BOOL		b = 0;
 
  if( !wndPtr || ( !dx && !dy )) return 0;
 
- dprintf_scroll(stddeb,"SCROLL_ScrollChildren: hwnd "NPFMT" dx=%i dy=%i\n",hScroll,dx,dy);
+ dprintf_scroll(stddeb,"SCROLL_ScrollChildren: hwnd %04x dx=%i dy=%i\n",hScroll,dx,dy);
 
  /* get a region in client rect invalidated by siblings and ansectors */
  hUpdateRgn = SCROLL_TraceChildren(hScroll, dx , dy, DCX_CLIPSIBLINGS);
 
- /* update children coordinates */
- while( hWnd )
-  {
-	wndPtr = WIN_FindWndPtr( hWnd );
-
+   /* update children coordinates */
+   for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
+   {
 	/* we can check if window intersects with clipRect parameter
 	 * and do not move it if not - just a thought.     - AK
 	 */
-
-	SetWindowPos(hWnd,0,wndPtr->rectWindow.left + dx,
-			    wndPtr->rectWindow.top  + dy, 0,0, SWP_NOZORDER |
-			    SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW |
-			    SWP_DEFERERASE );
-
-	hWnd = wndPtr->hwndNext;
+	SetWindowPos(wndPtr->hwndSelf, 0, wndPtr->rectWindow.left + dx,
+                     wndPtr->rectWindow.top  + dy, 0,0, SWP_NOZORDER |
+                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW |
+                     SWP_DEFERERASE );
   } 
 
  /* invalidate uncovered region and paint frames */
@@ -209,11 +203,9 @@
     short width, height;
     DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
 
-    dprintf_scroll(stddeb,"ScrollDC: dx=%d dy=%d, hrgnUpdate="NPFMT" rc=%i %i %i %i\n",
-                                     dx,dy,hrgnUpdate,(int)((rc)?rc->left:0),
-				                      (int)((rc)?rc->top:0),
-				                      (int)((rc)?rc->right:0),
-				                      (int)((rc)?rc->bottom:0)); 
+    dprintf_scroll(stddeb,"ScrollDC: dx=%d dy=%d, hrgnUpdate=%04x rc=%d %d %d %d\n",
+                   dx,dy,hrgnUpdate,((rc)?rc->left:0), ((rc)?rc->top:0),
+                   ((rc)?rc->right:0), ((rc)?rc->bottom:0)); 
 
     if (rc == NULL)
 	return FALSE;
diff --git a/windows/timer.c b/windows/timer.c
index 1be4855..ca1a620 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -114,7 +114,7 @@
 	TIMER_RestartTimer( pTimer, curTime );
     }
 
-    dprintf_timer(stddeb, "Timer expired: %p, "NPFMT", %04x, %04x, %08lx\n", 
+    dprintf_timer(stddeb, "Timer expired: %p, %04x, %04x, %04x, %08lx\n", 
 		  pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc);
       /* Build the message */
     msg->hwnd    = pTimer->hwnd;
@@ -170,7 +170,7 @@
     pTimer->timeout = timeout;
     pTimer->expires = GetTickCount() + timeout;
     pTimer->proc    = proc;
-    dprintf_timer(stddeb, "Timer added: %p, "NPFMT", %04x, %04x, %08lx\n", 
+    dprintf_timer(stddeb, "Timer added: %p, %04x, %04x, %04x, %08lx\n", 
 		  pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc);
     TIMER_InsertTimer( pTimer );
     QUEUE_IncTimerCount( GetTaskQueue(0) );
@@ -217,7 +217,7 @@
  */
 WORD SetTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
 {
-    dprintf_timer(stddeb, "SetTimer: "NPFMT" %d %d %08lx\n", hwnd, id, timeout, (LONG)proc );
+    dprintf_timer(stddeb, "SetTimer: %04x %d %d %08lx\n", hwnd, id, timeout, (LONG)proc );
     return TIMER_SetTimer( hwnd, id, timeout, proc, FALSE );
 }
 
@@ -227,7 +227,7 @@
  */
 WORD SetSystemTimer( HWND hwnd, WORD id, WORD timeout, FARPROC proc )
 {
-    dprintf_timer(stddeb, "SetSystemTimer: "NPFMT" %d %d %08lx\n", 
+    dprintf_timer(stddeb, "SetSystemTimer: %04x %d %d %08lx\n", 
 		  hwnd, id, timeout, (LONG)proc );
     return TIMER_SetTimer( hwnd, id, timeout, proc, TRUE );
 }
@@ -238,7 +238,7 @@
  */
 BOOL KillTimer( HWND hwnd, WORD id )
 {
-    dprintf_timer(stddeb, "KillTimer: "NPFMT" %d\n", hwnd, id );
+    dprintf_timer(stddeb, "KillTimer: %04x %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, FALSE );
 }
 
@@ -248,6 +248,6 @@
  */
 BOOL KillSystemTimer( HWND hwnd, WORD id )
 {
-    dprintf_timer(stddeb, "KillSystemTimer: "NPFMT" %d\n", hwnd, id );
+    dprintf_timer(stddeb, "KillSystemTimer: %04x %d\n", hwnd, id );
     return TIMER_KillTimer( hwnd, id, TRUE );
 }
diff --git a/windows/win.c b/windows/win.c
index eb7f3d1..8511a73 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -27,7 +27,9 @@
 /* #define DEBUG_MENU */
 #include "debug.h"
 
-static HWND hwndDesktop  = 0;
+/* Desktop window */
+static WND *pWndDesktop = NULL;
+
 static HWND hwndSysModal = 0;
 
 static WORD wDragWidth = 4;
@@ -47,6 +49,12 @@
     if (!hwnd) return NULL;
     ptr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
     if (ptr->dwMagic != WND_MAGIC) return NULL;
+    if (ptr->hwndSelf != hwnd)
+    {
+        fprintf( stderr, "Can't happen: hwnd %04x self pointer is %04x\n",
+                 hwnd, ptr->hwndSelf );
+        return NULL;
+    }
     return ptr;
 }
 
@@ -72,14 +80,14 @@
     if (!GetClassName( hwnd, className, sizeof(className ) ))
         strcpy( className, "#NULL#" );
 
-    fprintf( stderr, "Window %04x:\n", hwnd );
+    fprintf( stderr, "Window %04x (%p):\n", hwnd, ptr );
     fprintf( stderr,
-             "next=%04x  child=%04x  parent=%04x  owner=%04x  class=%04x '%s'\n"
+             "next=%p  child=%p  parent=%p  owner=%p  class=%04x '%s'\n"
              "inst=%04x  taskQ=%04x  updRgn=%04x  active=%04x hdce=%04x  idmenu=%04x\n"
              "style=%08lx  exstyle=%08lx  wndproc=%08lx  text=%04x '%s'\n"
              "client=%d,%d-%d,%d  window=%d,%d-%d,%d  iconpos=%d,%d  maxpos=%d,%d\n"
              "sysmenu=%04x  flags=%04x  props=%04x  vscroll=%04x  hscroll=%04x\n",
-             ptr->hwndNext, ptr->hwndChild, ptr->hwndParent, ptr->hwndOwner,
+             ptr->next, ptr->child, ptr->parent, ptr->owner,
              ptr->hClass, className, ptr->hInstance, ptr->hmemTaskQ,
              ptr->hrgnUpdate, ptr->hwndLastActive, ptr->hdce, ptr->wIDmenu,
              ptr->dwStyle, ptr->dwExStyle, (DWORD)ptr->lpfnWndProc, ptr->hText,
@@ -113,19 +121,20 @@
     CLASS *classPtr;
     char className[80];
 
-    if (!hwnd) hwnd = hwndDesktop;
+    ptr = hwnd ? WIN_FindWndPtr( hwnd ) : pWndDesktop;
+    if (!ptr)
+    {
+        fprintf( stderr, "*** Invalid window handle\n" );
+        return;
+    }
+
     if (!indent)  /* first time around */
         fprintf( stderr, "%-16.16s %-8.8s %-6.6s %-17.17s %-8.8s %s\n",
                  "hwnd", " wndPtr", "queue", "Class Name", " Style", " WndProc");
 
-    while (hwnd)
+    while (ptr)
     {
-        fprintf( stderr, "%*s%04x%*s", indent, "", hwnd, 13-indent, "" );
-        if (!(ptr = WIN_FindWndPtr( hwnd )))
-        {
-            fprintf( stderr, "*** Invalid window handle\n" );
-            return;
-        }
+        fprintf(stderr, "%*s%04x%*s", indent, "", ptr->hwndSelf, 13-indent,"");
         
         if (!(classPtr = CLASS_FindClassPtr( ptr->hClass ))) strcpy( className, "#NULL#" );
         else GlobalGetAtomName( classPtr->atomName, className, sizeof(className) );
@@ -136,8 +145,8 @@
                  HIWORD(ptr->lpfnWndProc),
                  LOWORD(ptr->lpfnWndProc));
         
-        if (ptr->hwndChild) WIN_WalkWindows( ptr->hwndChild, indent+1 );
-        hwnd = ptr->hwndNext;
+        if (ptr->child) WIN_WalkWindows( ptr->child->hwndSelf, indent+1 );
+        ptr = ptr->next;
     }
 }
 
@@ -150,10 +159,7 @@
 Window WIN_GetXWindow( HWND hwnd )
 {
     WND *wndPtr = WIN_FindWndPtr( hwnd );
-    while (wndPtr && !wndPtr->window)
-    {
-        wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-    }
+    while (wndPtr && !wndPtr->window) wndPtr = wndPtr->parent;
     return wndPtr ? wndPtr->window : 0;
 }
 
@@ -165,20 +171,12 @@
  */
 BOOL WIN_UnlinkWindow( HWND hwnd )
 {    
-    HWND * curWndPtr;
-    WND *parentPtr, *wndPtr;
+    WND *wndPtr, **ppWnd;
 
-    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
-    if (!(parentPtr = WIN_FindWndPtr( wndPtr->hwndParent ))) return FALSE;
-
-    curWndPtr = &parentPtr->hwndChild;
-
-    while (*curWndPtr != hwnd)
-    {
-	WND * curPtr = WIN_FindWndPtr( *curWndPtr );
-	curWndPtr = &curPtr->hwndNext;
-    }
-    *curWndPtr = wndPtr->hwndNext;
+    if (!(wndPtr = WIN_FindWndPtr( hwnd )) || !wndPtr->parent) return FALSE;
+    ppWnd = &wndPtr->parent->child;
+    while (*ppWnd != wndPtr) ppWnd = &(*ppWnd)->next;
+    *ppWnd = wndPtr->next;
     return TRUE;
 }
 
@@ -192,30 +190,24 @@
  */
 BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter )
 {    
-    HWND * hwndPtr = NULL;  /* pointer to hwnd to change */
-    WND *wndPtr, *parentPtr;
+    WND *wndPtr, **ppWnd;
 
-    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
-    if (!(parentPtr = WIN_FindWndPtr( wndPtr->hwndParent ))) return FALSE;
+    if (!(wndPtr = WIN_FindWndPtr( hwnd )) || !wndPtr->parent) return FALSE;
 
     if ((hwndInsertAfter == HWND_TOP) || (hwndInsertAfter == HWND_BOTTOM))
     {
-	hwndPtr = &parentPtr->hwndChild;  /* Point to first sibling hwnd */
+        ppWnd = &wndPtr->parent->child;  /* Point to first sibling hwnd */
 	if (hwndInsertAfter == HWND_BOTTOM)  /* Find last sibling hwnd */
-	    while (*hwndPtr)
-	    {
-		WND * nextPtr = WIN_FindWndPtr( *hwndPtr );
-		hwndPtr = &nextPtr->hwndNext;
-	    }
+	    while (*ppWnd) ppWnd = &(*ppWnd)->next;
     }
     else  /* Normal case */
     {
 	WND * afterPtr = WIN_FindWndPtr( hwndInsertAfter );
-	if (afterPtr) hwndPtr = &afterPtr->hwndNext;
+	if (!afterPtr) return FALSE;
+        ppWnd = &afterPtr->next;
     }
-    if (!hwndPtr) return FALSE;
-    wndPtr->hwndNext = *hwndPtr;
-    *hwndPtr = hwnd;
+    wndPtr->next = *ppWnd;
+    *ppWnd = wndPtr;
     return TRUE;
 }
 
@@ -230,22 +222,21 @@
     WND * wndPtr;
 
       /* Note: the desktop window never gets WM_PAINT messages */
-    if (!hwnd) hwnd = GetTopWindow( hwndDesktop );
-    for ( ; hwnd != 0; hwnd = wndPtr->hwndNext )
+    wndPtr = hwnd ? WIN_FindWndPtr( hwnd ) : pWndDesktop->child;
+    for ( ; wndPtr; wndPtr = wndPtr->next)
     {
-	if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
-	dprintf_win( stddeb, "WIN_FindWinToRepaint: "NPFMT", style %08lx\n",
-		     hwnd, wndPtr->dwStyle );
+	dprintf_win( stddeb, "WIN_FindWinToRepaint: %04x, style %08lx\n",
+		     wndPtr->hwndSelf, wndPtr->dwStyle );
         if (!(wndPtr->dwStyle & WS_VISIBLE) || (wndPtr->flags & WIN_NO_REDRAW))
             continue;
         if ((wndPtr->dwStyle & WS_MINIMIZE) && (WIN_CLASS_INFO(wndPtr).hIcon))
             continue;
 	if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT))
-	    return hwnd;
-	if (wndPtr->hwndChild)
+	    return wndPtr->hwndSelf;
+	if (wndPtr->child)
 	{
 	    HWND child;
-	    if ((child = WIN_FindWinToRepaint( wndPtr->hwndChild )))
+	    if ((child = WIN_FindWinToRepaint( wndPtr->child->hwndSelf )))
 		return child;
 	}
     }
@@ -266,15 +257,15 @@
     while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
     {
         if (wndPtr->dwExStyle & WS_EX_NOPARENTNOTIFY) break;
+        wndPtr = wndPtr->parent;
 #ifdef WINELIB32
-	SendMessage( wndPtr->hwndParent, WM_PARENTNOTIFY, 
+	SendMessage( wndPtr->hwndSelf, WM_PARENTNOTIFY, 
 		     MAKEWPARAM(event,idChild),
 		     (LPARAM)lValue );
 #else
-	SendMessage( wndPtr->hwndParent, WM_PARENTNOTIFY, event,
+	SendMessage( wndPtr->hwndSelf, WM_PARENTNOTIFY, event,
 		     MAKELPARAM(LOWORD(lValue), idChild) );
 #endif
-        wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
     }
 }
 
@@ -297,6 +288,7 @@
     if (!wndPtr || !classPtr) return;
     WIN_UnlinkWindow( hwnd ); /* Remove the window from the linked list */
     wndPtr->dwMagic = 0;  /* Mark it as invalid */
+    wndPtr->hwndSelf = 0;
     if ((wndPtr->hrgnUpdate) || (wndPtr->flags & WIN_INTERNAL_PAINT))
     {
         if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
@@ -321,55 +313,57 @@
  */
 BOOL WIN_CreateDesktopWindow(void)
 {
-    WND *wndPtr;
     HCLASS hclass;
     CLASS *classPtr;
     HDC hdc;
+    HWND hwndDesktop;
 
     if (!(hclass = CLASS_FindClassByName( DESKTOP_CLASS_ATOM, 0, &classPtr )))
 	return FALSE;
 
     hwndDesktop = USER_HEAP_ALLOC( sizeof(WND)+classPtr->wc.cbWndExtra );
     if (!hwndDesktop) return FALSE;
-    wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwndDesktop );
+    pWndDesktop = (WND *) USER_HEAP_LIN_ADDR( hwndDesktop );
 
-    wndPtr->hwndNext          = 0;
-    wndPtr->hwndChild         = 0;
-    wndPtr->dwMagic           = WND_MAGIC;
-    wndPtr->hwndParent        = 0;
-    wndPtr->hwndOwner         = 0;
-    wndPtr->hClass            = hclass;
-    wndPtr->hInstance         = 0;
-    wndPtr->rectWindow.left   = 0;
-    wndPtr->rectWindow.top    = 0;
-    wndPtr->rectWindow.right  = SYSMETRICS_CXSCREEN;
-    wndPtr->rectWindow.bottom = SYSMETRICS_CYSCREEN;
-    wndPtr->rectClient        = wndPtr->rectWindow;
-    wndPtr->rectNormal        = wndPtr->rectWindow;
-    wndPtr->ptIconPos.x       = -1;
-    wndPtr->ptIconPos.y       = -1;
-    wndPtr->ptMaxPos.x        = -1;
-    wndPtr->ptMaxPos.y        = -1;
-    wndPtr->hmemTaskQ         = 0;  /* Desktop does not belong to a task */
-    wndPtr->hrgnUpdate        = 0;
-    wndPtr->hwndLastActive    = hwndDesktop;
-    wndPtr->lpfnWndProc       = classPtr->wc.lpfnWndProc;
-    wndPtr->dwStyle           = WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
-    wndPtr->dwExStyle         = 0;
-    wndPtr->hdce              = 0;
-    wndPtr->hVScroll          = 0;
-    wndPtr->hHScroll          = 0;
-    wndPtr->wIDmenu           = 0;
-    wndPtr->hText             = 0;
-    wndPtr->flags             = 0;
-    wndPtr->window            = rootWindow;
-    wndPtr->hSysMenu          = 0;
-    wndPtr->hProp	      = 0;
-    EVENT_RegisterWindow( wndPtr->window, hwndDesktop );
+    pWndDesktop->next              = NULL;
+    pWndDesktop->child             = NULL;
+    pWndDesktop->parent            = NULL;
+    pWndDesktop->owner             = NULL;
+    pWndDesktop->dwMagic           = WND_MAGIC;
+    pWndDesktop->hwndSelf          = hwndDesktop;
+    pWndDesktop->hClass            = hclass;
+    pWndDesktop->hInstance         = 0;
+    pWndDesktop->rectWindow.left   = 0;
+    pWndDesktop->rectWindow.top    = 0;
+    pWndDesktop->rectWindow.right  = SYSMETRICS_CXSCREEN;
+    pWndDesktop->rectWindow.bottom = SYSMETRICS_CYSCREEN;
+    pWndDesktop->rectClient        = pWndDesktop->rectWindow;
+    pWndDesktop->rectNormal        = pWndDesktop->rectWindow;
+    pWndDesktop->ptIconPos.x       = -1;
+    pWndDesktop->ptIconPos.y       = -1;
+    pWndDesktop->ptMaxPos.x        = -1;
+    pWndDesktop->ptMaxPos.y        = -1;
+    pWndDesktop->hmemTaskQ         = 0; /* Desktop does not belong to a task */
+    pWndDesktop->hrgnUpdate        = 0;
+    pWndDesktop->hwndLastActive    = hwndDesktop;
+    pWndDesktop->lpfnWndProc       = classPtr->wc.lpfnWndProc;
+    pWndDesktop->dwStyle           = WS_VISIBLE | WS_CLIPCHILDREN |
+                                     WS_CLIPSIBLINGS;
+    pWndDesktop->dwExStyle         = 0;
+    pWndDesktop->hdce              = 0;
+    pWndDesktop->hVScroll          = 0;
+    pWndDesktop->hHScroll          = 0;
+    pWndDesktop->wIDmenu           = 0;
+    pWndDesktop->hText             = 0;
+    pWndDesktop->flags             = 0;
+    pWndDesktop->window            = rootWindow;
+    pWndDesktop->hSysMenu          = 0;
+    pWndDesktop->hProp	      = 0;
+    EVENT_RegisterWindow( pWndDesktop->window, hwndDesktop );
     SendMessage( hwndDesktop, WM_NCCREATE, 0, 0 );
     if ((hdc = GetDC( hwndDesktop )) != 0)
     {
-        SendMessage( hwndDesktop, WM_ERASEBKGND, (WPARAM)hdc, 0 );
+        SendMessage( hwndDesktop, WM_ERASEBKGND, hdc, 0 );
         ReleaseDC( hwndDesktop, hdc );
     }
     return TRUE;
@@ -416,7 +410,7 @@
     else
         dprintf_win( stddeb, "%04x ", LOWORD(className) );
 
-    dprintf_win(stddeb, "%08lx %08lx %d,%d %dx%d "NPFMT" "NPFMT" "NPFMT" %08lx\n",
+    dprintf_win(stddeb, "%08lx %08lx %d,%d %dx%d %04x %04x %04x %08lx\n",
 		exStyle, style, x, y, width, height,
 		parent, menu, instance, (DWORD)data);
 
@@ -433,7 +427,7 @@
     {
 	/* Make sure parent is valid */
         if (!IsWindow( parent )) {
-	    dprintf_win(stddeb,"CreateWindowEx: Parent "NPFMT" is not a window\n", parent);
+	    dprintf_win(stddeb,"CreateWindowEx: Parent %04x is not a window\n", parent);
 	    return 0;
 	}
     }
@@ -472,12 +466,13 @@
       /* Fill the structure */
 
     wndPtr = (WND *) USER_HEAP_LIN_ADDR( hwnd );
-    wndPtr->hwndNext       = 0;
-    wndPtr->hwndChild      = 0;
+    wndPtr->next           = NULL;
+    wndPtr->child          = NULL;
+    wndPtr->parent         = (style & WS_CHILD) ? WIN_FindWndPtr( parent ) : pWndDesktop;
+    wndPtr->owner          = (style & WS_CHILD) ? NULL : WIN_FindWndPtr(WIN_GetTopParent(parent));
     wndPtr->window         = 0;
     wndPtr->dwMagic        = WND_MAGIC;
-    wndPtr->hwndParent     = (style & WS_CHILD) ? parent : hwndDesktop;
-    wndPtr->hwndOwner      = (style & WS_CHILD) ? 0 : WIN_GetTopParent(parent);
+    wndPtr->hwndSelf       = hwnd;
     wndPtr->hClass         = class;
     wndPtr->hInstance      = instance;
     wndPtr->ptIconPos.x    = -1;
@@ -644,7 +639,7 @@
     }
     else if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
 
-    dprintf_win(stddeb, "CreateWindowEx: return "NPFMT" \n", hwnd);
+    dprintf_win(stddeb, "CreateWindowEx: return %04x\n", hwnd);
     return hwnd;
 }
 
@@ -657,11 +652,11 @@
     WND * wndPtr;
     CLASS * classPtr;
 
-    dprintf_win(stddeb, "DestroyWindow ("NPFMT")\n", hwnd);
+    dprintf_win(stddeb, "DestroyWindow(%04x)\n", hwnd);
     
       /* Initialisation */
 
-    if (hwnd == hwndDesktop) return FALSE;  /* Can't destroy desktop */
+    if (hwnd == pWndDesktop->hwndSelf) return FALSE; /* Can't destroy desktop*/
     if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
     if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return FALSE;
 
@@ -678,22 +673,21 @@
 
     for (;;)
     {
-        HWND hwndSibling = GetWindow( hwnd, GW_HWNDFIRST );
-        while (hwndSibling)
+        WND *siblingPtr = wndPtr->parent->child;  /* First sibling */
+        while (siblingPtr)
         {
-            WND *siblingPtr = WIN_FindWndPtr( hwndSibling );
-            if (siblingPtr->hwndOwner == hwnd) break;
-            hwndSibling = siblingPtr->hwndNext;
+            if (siblingPtr->owner == wndPtr) break;
+            siblingPtr = siblingPtr->next;
         }
-        if (hwndSibling) DestroyWindow( hwndSibling );
+        if (siblingPtr) DestroyWindow( siblingPtr->hwndSelf );
         else break;
     }
 
       /* Send destroy messages and destroy children */
 
     SendMessage( hwnd, WM_DESTROY, 0, 0 );
-    while (wndPtr->hwndChild)  /* The child removes itself from the list */
-	DestroyWindow( wndPtr->hwndChild );
+    while (wndPtr->child)  /* The child removes itself from the list */
+	DestroyWindow( wndPtr->child->hwndSelf );
     SendMessage( hwnd, WM_NCDESTROY, 0, 0 );
 
       /* Destroy the window */
@@ -733,7 +727,7 @@
 {
     HCLASS hclass;
     CLASS *classPtr;
-    HWND hwnd;
+    WND *wndPtr;
 
     if (ClassMatch)
     {
@@ -743,32 +737,40 @@
     }
     else hclass = 0;
 
-    hwnd = GetTopWindow( hwndDesktop );
-    while(hwnd)
+    wndPtr = pWndDesktop->child;
+    while (wndPtr)
     {
-	WND *wndPtr = WIN_FindWndPtr( hwnd );
 	if (!hclass || (wndPtr->hClass == hclass))
 	{
 	      /* Found matching class */
-	    if (!TitleMatch) return hwnd;
+	    if (!TitleMatch) return wndPtr->hwndSelf;
 	    if (wndPtr->hText)
 	    {
 		char *textPtr = (char *) USER_HEAP_LIN_ADDR( wndPtr->hText );
-		if (!strcmp( textPtr, TitleMatch )) return hwnd;
+		if (!strcmp( textPtr, TitleMatch )) return wndPtr->hwndSelf;
 	    }
 	}
-	hwnd = wndPtr->hwndNext;
+        wndPtr = wndPtr->next;
     }
     return 0;
 }
  
  
 /**********************************************************************
+ *           WIN_GetDesktop
+ */
+WND *WIN_GetDesktop(void)
+{
+    return pWndDesktop;
+}
+
+
+/**********************************************************************
  *           GetDesktopWindow   (USER.286)
  */
 HWND GetDesktopWindow(void)
 {
-    return hwndDesktop;
+    return pWndDesktop->hwndSelf;
 }
 
 
@@ -780,7 +782,7 @@
  */
 HWND GetDesktopHwnd(void)
 {
-    return hwndDesktop;
+    return pWndDesktop->hwndSelf;
 }
 
 
@@ -843,7 +845,7 @@
             fprintf(stderr,"GetWindowWord called with offset %d.\n",offset);
             return 0;
 #else
-	case GWW_HWNDPARENT: return (WORD)wndPtr->hwndParent;
+	case GWW_HWNDPARENT: return wndPtr->parent ? wndPtr->parent->hwndSelf : 0;
 	case GWW_HINSTANCE:  return (WORD)wndPtr->hInstance;
 #endif
     }
@@ -904,8 +906,8 @@
         case GWL_EXSTYLE: return wndPtr->dwExStyle;
 	case GWL_WNDPROC: return (LONG)wndPtr->lpfnWndProc;
 #ifdef WINELIB32
-	case GWW_HWNDPARENT: return (LONG)wndPtr->hwndParent;
-	case GWW_HINSTANCE:  return (LONG)wndPtr->hInstance;
+	case GWW_HWNDPARENT: return wndPtr->parent ? wndPtr->parent->hwndSelf : 0;
+	case GWW_HINSTANCE:  return wndPtr->hInstance;
 #endif
     }
     return 0;
@@ -937,10 +939,9 @@
 /*******************************************************************
  *         GetWindowText          (USER.36)
  */
-int WIN16_GetWindowText( HWND hwnd, SEGPTR lpString, int nMaxCount )
+int WIN16_GetWindowText( HWND hwnd, SEGPTR lpString, INT nMaxCount )
 {
-    return (int)SendMessage(hwnd, WM_GETTEXT, (WORD)nMaxCount, 
-			                      (DWORD)lpString);
+    return (int)SendMessage(hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString);
 }
 
 int GetWindowText( HWND hwnd, LPSTR lpString, int nMaxCount )
@@ -964,7 +965,7 @@
  */
 void WIN16_SetWindowText( HWND hwnd, SEGPTR lpString )
 {
-    SendMessage( hwnd, WM_SETTEXT, 0, (DWORD)lpString );
+    SendMessage( hwnd, WM_SETTEXT, 0, (LPARAM)lpString );
 }
 
 void SetWindowText( HWND hwnd, LPCSTR lpString )
@@ -1006,8 +1007,8 @@
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
     if (!wndPtr) return 0;
-    return (wndPtr->dwStyle & WS_CHILD) ?
-            wndPtr->hwndParent : wndPtr->hwndOwner;
+    wndPtr = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->parent : wndPtr->owner;
+    return wndPtr ? wndPtr->hwndSelf : 0;
 }
 
 
@@ -1018,13 +1019,9 @@
  */
 HWND WIN_GetTopParent( HWND hwnd )
 {
-    while (hwnd)
-    {
-        WND *wndPtr = WIN_FindWndPtr( hwnd );
-        if (wndPtr->dwStyle & WS_CHILD) hwnd = wndPtr->hwndParent;
-        else break;
-    }
-    return hwnd;
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    while (wndPtr && (wndPtr->dwStyle & WS_CHILD)) wndPtr = wndPtr->parent;
+    return wndPtr ? wndPtr->hwndSelf : 0;
 }
 
 
@@ -1033,23 +1030,21 @@
  */
 HWND SetParent(HWND hwndChild, HWND hwndNewParent)
 {
-    HWND temp;
+    HWND oldParent;
 
     WND *wndPtr = WIN_FindWndPtr(hwndChild);
-    if (!wndPtr || !(wndPtr->dwStyle & WS_CHILD)) return 0;
+    WND *pWndParent = WIN_FindWndPtr( hwndNewParent );
+    if (!wndPtr || !pWndParent || !(wndPtr->dwStyle & WS_CHILD)) return 0;
 
-    temp = wndPtr->hwndParent;
+    oldParent = wndPtr->parent->hwndSelf;
 
     WIN_UnlinkWindow(hwndChild);
-    if (hwndNewParent)
-      wndPtr->hwndParent = hwndNewParent;
-    else
-      wndPtr->hwndParent = GetDesktopWindow();
+    if (hwndNewParent) wndPtr->parent = pWndParent;
     WIN_LinkWindow(hwndChild, HWND_BOTTOM);
     
     if (IsWindowVisible(hwndChild)) UpdateWindow(hwndChild);
     
-    return temp;
+    return oldParent;
 }
 
 
@@ -1062,8 +1057,8 @@
     WND * wndPtr = WIN_FindWndPtr( child );
     while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
     {
-	if (wndPtr->hwndParent == parent) return TRUE;
-        wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+        wndPtr = wndPtr->parent;
+	if (wndPtr->hwndSelf == parent) return TRUE;
     }
     return FALSE;
 }
@@ -1078,7 +1073,7 @@
     while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
     {
         if (!(wndPtr->dwStyle & WS_VISIBLE)) return FALSE;
-        wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
+        wndPtr = wndPtr->parent;
     }
     return (wndPtr && (wndPtr->dwStyle & WS_VISIBLE));
 }
@@ -1091,7 +1086,7 @@
 HWND GetTopWindow( HWND hwnd )
 {
     WND * wndPtr = WIN_FindWndPtr( hwnd );
-    if (wndPtr) return wndPtr->hwndChild;
+    if (wndPtr && wndPtr->child) return wndPtr->child->hwndSelf;
     else return 0;
 }
 
@@ -1106,50 +1101,34 @@
     switch(rel)
     {
     case GW_HWNDFIRST:
-	if (wndPtr->hwndParent)
-	{
-	    WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-	    return parentPtr->hwndChild;
-	}
+        if (wndPtr->parent) return wndPtr->parent->child->hwndSelf;
 	else return 0;
 	
     case GW_HWNDLAST:
-	if (!wndPtr->hwndParent) return 0;  /* Desktop window */
-	while (wndPtr->hwndNext)
-	{
-	    hwnd = wndPtr->hwndNext;
-	    wndPtr = WIN_FindWndPtr( hwnd );
-	}
-	return hwnd;
+	if (!wndPtr->parent) return 0;  /* Desktop window */
+	while (wndPtr->next) wndPtr = wndPtr->next;
+        return wndPtr->hwndSelf;
 	
     case GW_HWNDNEXT:
-	return wndPtr->hwndNext;
+        if (!wndPtr->next) return 0;
+	return wndPtr->next->hwndSelf;
 	
-    case GW_HWNDPREV:	
-	{
-	    HWND hwndPrev;
-	    
-	    if (wndPtr->hwndParent)
-	    {
-		WND * parentPtr = WIN_FindWndPtr( wndPtr->hwndParent );
-		hwndPrev = parentPtr->hwndChild;
-	    }
-	    else return 0;  /* Desktop window */
-	    if (hwndPrev == hwnd) return 0;
-	    while (hwndPrev)
-	    {
-		wndPtr = WIN_FindWndPtr( hwndPrev );
-		if (wndPtr->hwndNext == hwnd) break;
-		hwndPrev = wndPtr->hwndNext;
-	    }
-	    return hwndPrev;
-	}
+    case GW_HWNDPREV:
+        if (!wndPtr->parent) return 0;  /* Desktop window */
+        wndPtr = wndPtr->parent->child;  /* First sibling */
+        if (wndPtr->hwndSelf == hwnd) return 0;  /* First in list */
+        while (wndPtr->next)
+        {
+            if (wndPtr->next->hwndSelf == hwnd) return wndPtr->hwndSelf;
+            wndPtr = wndPtr->next;
+        }
+        return 0;
 	
     case GW_OWNER:
-	return wndPtr->hwndOwner;
+	return wndPtr->owner ? wndPtr->owner->hwndSelf : 0;
 
     case GW_CHILD:
-	return wndPtr->hwndChild;
+	return wndPtr->child ? wndPtr->child->hwndSelf : 0;
     }
     return 0;
 }
@@ -1169,13 +1148,13 @@
  */
 void ShowOwnedPopups( HWND owner, BOOL fShow )
 {
-    HWND hwnd = GetWindow( hwndDesktop, GW_CHILD );
-    while (hwnd)
+    WND *pWnd = pWndDesktop->child;
+    while (pWnd)
     {
-        WND *wnd = WIN_FindWndPtr(hwnd);
-        if (wnd->hwndOwner == owner && (wnd->dwStyle & WS_POPUP))
-            ShowWindow( hwnd, fShow ? SW_SHOW : SW_HIDE );
-        hwnd = wnd->hwndNext;
+        if (pWnd->owner && (pWnd->owner->hwndSelf == owner) &&
+            (pWnd->dwStyle & WS_POPUP))
+            ShowWindow( pWnd->hwndSelf, fShow ? SW_SHOW : SW_HIDE );
+        pWnd = pWnd->next;
     }
 }
 
@@ -1197,7 +1176,6 @@
  */
 BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam )
 {
-    HWND hwnd;
     WND *wndPtr;
     HWND *list, *pWnd;
     int count;
@@ -1209,21 +1187,14 @@
       /* First count the windows */
 
     count = 0;
-    for (hwnd = GetTopWindow(hwndDesktop); hwnd != 0; hwnd = wndPtr->hwndNext)
-    {
-        if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
-        count++;
-    }
+    for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next) count++;
     if (!count) return TRUE;
 
       /* Now build the list of all windows */
 
-    if (!(list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
-    for (hwnd = GetTopWindow(hwndDesktop), pWnd = list; hwnd != 0; hwnd = wndPtr->hwndNext)
-    {
-        wndPtr = WIN_FindWndPtr( hwnd );
-        *pWnd++ = hwnd;
-    }
+    if (!(pWnd = list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
+    for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
+        *pWnd++ = wndPtr->hwndSelf;
 
       /* Now call the callback function for every window */
 
@@ -1243,7 +1214,6 @@
  */
 BOOL EnumTaskWindows( HTASK hTask, WNDENUMPROC lpEnumFunc, LPARAM lParam )
 {
-    HWND hwnd;
     WND *wndPtr;
     HWND *list, *pWnd;
     HANDLE hQueue = GetTaskQueue( hTask );
@@ -1255,21 +1225,15 @@
       /* First count the windows */
 
     count = 0;
-    for (hwnd = GetTopWindow(hwndDesktop); hwnd != 0; hwnd = wndPtr->hwndNext)
-    {
-        if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
+    for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
         if (wndPtr->hmemTaskQ == hQueue) count++;
-    }
     if (!count) return TRUE;
 
       /* Now build the list of all windows */
 
-    if (!(list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
-    for (hwnd = GetTopWindow(hwndDesktop), pWnd = list; hwnd != 0; hwnd = wndPtr->hwndNext)
-    {
-        wndPtr = WIN_FindWndPtr( hwnd );
-        if (wndPtr->hmemTaskQ == hQueue) *pWnd++ = hwnd;
-    }
+    if (!(pWnd = list = (HWND *)malloc( sizeof(HWND) * count ))) return FALSE;
+    for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
+        if (wndPtr->hmemTaskQ == hQueue) *pWnd++ = wndPtr->hwndSelf;
 
       /* Now call the callback function for every window */
 
@@ -1295,24 +1259,23 @@
  *   o call ourselves with the next child window
  * 
  */
-static BOOL WIN_EnumChildWin(HWND hwnd, FARPROC wndenumprc, LPARAM lParam)
+static BOOL WIN_EnumChildWin( WND *wndPtr, FARPROC wndenumprc, LPARAM lParam )
 {
-    WND *wndPtr;
-    HWND hwndN,hwndCh;
-
-    while (hwnd)
+    WND *pWndNext, *pWndChild;
+    while (wndPtr)
     {
-        if (!(wndPtr=WIN_FindWndPtr(hwnd))) return 0;
-        hwndN=wndPtr->hwndNext;		/* storing hwnd is a way to avoid.. */
-        hwndCh=wndPtr->hwndChild;		/* ..side effects after wndenumprc  */
-        if (!CallEnumWindowsProc( wndenumprc, hwnd, lParam )) return 0;
-        if (IsWindow(hwndCh))			/* to prevent too early termination */
-         if (!WIN_EnumChildWin(hwndCh, wndenumprc, lParam)) return 0;
-        hwnd=hwndN;
+        pWndNext = wndPtr->next;    /* storing hwnd is a way to avoid.. */
+        pWndChild = wndPtr->child;  /* ..side effects after wndenumprc  */
+        if (!CallEnumWindowsProc( wndenumprc, wndPtr->hwndSelf, lParam ))
+            return 0;
+        if (IsWindow(pWndChild->hwndSelf)) /*to prevent too early termination*/
+            if (!WIN_EnumChildWin(pWndChild, wndenumprc, lParam)) return 0;
+        wndPtr = pWndNext;
     } 
     return 1;
 }
 
+
 /*******************************************************************
  *    EnumChildWindows        (USER.55)
  *
@@ -1328,27 +1291,19 @@
 
     if (hwnd == 0) return 0;
     if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
-    hwnd = wndPtr->hwndChild;
-    return WIN_EnumChildWin(hwnd, wndenumprc, lParam);         
+    return WIN_EnumChildWin(wndPtr->child, wndenumprc, lParam);
 }
 
 
 /*******************************************************************
- *			AnyPopup		[USER.52]
+ *           AnyPopup   (USER.52)
  */
-BOOL AnyPopup()
+BOOL AnyPopup(void)
 {
- WND   *wndPtr = WIN_FindWndPtr(hwndDesktop);
- HWND   hwnd = wndPtr->hwndChild;
- 
- for( ; hwnd ; hwnd = wndPtr->hwndNext )
-  {
-	wndPtr = WIN_FindWndPtr(hwnd);
-	if(wndPtr->hwndOwner)
-	   if(wndPtr->dwStyle & WS_VISIBLE)
-		return TRUE;
-  }
-	return FALSE;
+    WND *wndPtr;
+    for (wndPtr = pWndDesktop->child; wndPtr; wndPtr = wndPtr->next)
+        if (wndPtr->owner && (wndPtr->dwStyle & WS_VISIBLE)) return TRUE;
+    return FALSE;
 }
 
 /*******************************************************************
@@ -1358,7 +1313,7 @@
 {
     WND *wndPtr = WIN_FindWndPtr(hWnd);
 
-    dprintf_win(stddeb,"FlashWindow: "NPFMT"\n", hWnd);
+    dprintf_win(stddeb,"FlashWindow: %04x\n", hWnd);
 
     if (!wndPtr) return FALSE;
 
@@ -1401,7 +1356,7 @@
 {
     HWND hWndOldModal = hwndSysModal;
     hwndSysModal = hWnd;
-    dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow("NPFMT") !\n", hWnd);
+    dprintf_win(stdnimp,"EMPTY STUB !! SetSysModalWindow(%04x) !\n", hWnd);
     return hWndOldModal;
 }
 
@@ -1422,7 +1377,6 @@
  */
 BOOL DRAG_QueryUpdate( HWND hQueryWnd, SEGPTR spDragInfo )
 {
- HWND		hWnd;
  BOOL		wParam,bResult = 0;
  POINT		pt;
  LPDRAGINFO	ptrDragInfo = (LPDRAGINFO) PTR_SEG_TO_LIN(spDragInfo);
@@ -1443,32 +1397,29 @@
    {
      tempRect = ptrQueryWnd->rectClient;
      if(ptrQueryWnd->dwStyle & WS_CHILD)
-        MapWindowPoints(ptrQueryWnd->hwndParent,0,(LPPOINT)&tempRect,2);
+        MapWindowPoints(ptrQueryWnd->parent->hwndSelf,0,(LPPOINT)&tempRect,2);
 
      if( PtInRect(&tempRect,pt) )
 	{
 	 wParam = 0;
-	 ptrWnd = WIN_FindWndPtr(hWnd = ptrQueryWnd->hwndChild);
-
-	 for( ;ptrWnd ;ptrWnd = WIN_FindWndPtr(hWnd = ptrWnd->hwndNext) )
-	   if( ptrWnd->dwStyle & WS_VISIBLE )
+         
+	 for (ptrWnd = ptrQueryWnd->child; ptrWnd ;ptrWnd = ptrWnd->next)
+             if( ptrWnd->dwStyle & WS_VISIBLE )
 	     {
-	      GetWindowRect(hWnd,&tempRect);
+                 GetWindowRect(ptrWnd->hwndSelf,&tempRect);
 
-	      if( PtInRect(&tempRect,pt) ) 
-		  break;
+                 if( PtInRect(&tempRect,pt) ) 
+                     break;
 	     }
 
 	 if(ptrWnd)
-	    dprintf_msg(stddeb,"DragQueryUpdate: hwnd = "NPFMT", %i %i - %i %i\n",hWnd,
-			(int)ptrWnd->rectWindow.left,(int)ptrWnd->rectWindow.top,
-			(int)ptrWnd->rectWindow.right,(int)ptrWnd->rectWindow.bottom);	 
-	 else
-	    dprintf_msg(stddeb,"DragQueryUpdate: hwnd = "NPFMT"\n",hWnd);
-
-	 if(ptrWnd)
-	   if( !(ptrWnd->dwStyle & WS_DISABLED) )
-	        bResult = DRAG_QueryUpdate(hWnd, spDragInfo);
+         {
+	    dprintf_msg(stddeb,"DragQueryUpdate: hwnd = %04x, %d %d - %d %d\n",
+                        ptrWnd->hwndSelf, ptrWnd->rectWindow.left, ptrWnd->rectWindow.top,
+			ptrWnd->rectWindow.right, ptrWnd->rectWindow.bottom );
+            if( !(ptrWnd->dwStyle & WS_DISABLED) )
+	        bResult = DRAG_QueryUpdate(ptrWnd->hwndSelf, spDragInfo);
+         }
 
 	 if(bResult) return bResult;
 	}
@@ -1598,7 +1549,7 @@
     lpDragInfo->pt = msg.pt;
 
     /* update DRAGINFO struct */
-    dprintf_msg(stddeb,"drag: lpDI->hScope = "NPFMT"\n",lpDragInfo->hScope);
+    dprintf_msg(stddeb,"drag: lpDI->hScope = %04x\n",lpDragInfo->hScope);
 
     if( (btemp = (WORD)DRAG_QueryUpdate(hwndScope, spDragInfo)) > 0 )
 	 hCurrentCursor = hCursor;
diff --git a/windows/winpos.c b/windows/winpos.c
index 139a6ce..29f3d70 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -42,8 +42,8 @@
     short x, y, xspacing, yspacing;
     WND * wndPtr = WIN_FindWndPtr( hwnd );
 
-    if (!wndPtr) return;
-    GetClientRect( wndPtr->hwndParent, &rectParent );
+    if (!wndPtr || !wndPtr->parent) return;
+    GetClientRect( wndPtr->parent->hwndSelf, &rectParent );
     if ((wndPtr->ptIconPos.x >= rectParent.left) &&
         (wndPtr->ptIconPos.x + SYSMETRICS_CXICON < rectParent.right) &&
         (wndPtr->ptIconPos.y >= rectParent.top) &&
@@ -57,11 +57,10 @@
         for (x = rectParent.left; x<=rectParent.right-xspacing; x += xspacing)
         {
               /* Check if another icon already occupies this spot */
-            HWND hwndChild = GetWindow( wndPtr->hwndParent, GW_CHILD );
-            while (hwndChild)
+            WND *childPtr = wndPtr->parent->child;
+            while (childPtr)
             {
-                WND *childPtr = WIN_FindWndPtr( hwndChild );
-                if ((childPtr->dwStyle & WS_MINIMIZE) && (hwndChild != hwnd))
+                if ((childPtr->dwStyle & WS_MINIMIZE) && (childPtr != wndPtr))
                 {
                     if ((childPtr->rectWindow.left < x + xspacing) &&
                         (childPtr->rectWindow.right >= x) &&
@@ -69,10 +68,9 @@
                         (childPtr->rectWindow.bottom > y - yspacing))
                         break;  /* There's a window in there */
                 }
-                
-                hwndChild = childPtr->hwndNext;
+                childPtr = childPtr->next;
             }
-            if (!hwndChild)
+            if (!childPtr)
             {
                   /* No window was found, so it's OK for us */
                 wndPtr->ptIconPos.x = x + (xspacing - SYSMETRICS_CXICON) / 2;
@@ -129,7 +127,7 @@
     
     *rect = wndPtr->rectWindow;
     if (wndPtr->dwStyle & WS_CHILD)
-	MapWindowPoints( wndPtr->hwndParent, 0, (POINT *)rect, 2 );
+	MapWindowPoints( wndPtr->parent->hwndSelf, 0, (POINT *)rect, 2 );
 }
 
 
@@ -173,26 +171,24 @@
  *
  * Find the window and hittest for a given point.
  */
-INT WINPOS_WindowFromPoint( POINT pt, HWND *phwnd )
+INT WINPOS_WindowFromPoint( POINT pt, WND **ppWnd )
 {
     WND *wndPtr;
-    HWND hwnd;
     INT hittest = HTERROR;
     INT x, y;
 
-    *phwnd = 0;
+    *ppWnd = NULL;
     x = pt.x;
     y = pt.y;
-    hwnd = GetWindow( GetDesktopWindow(), GW_CHILD );
+    wndPtr = WIN_GetDesktop()->child;
     for (;;)
     {
-        while (hwnd)
+        while (wndPtr)
         {
             /* If point is in window, and window is visible, and it  */
             /* is enabled (or it's a top-level window), then explore */
             /* its children. Otherwise, go to the next window.       */
 
-            wndPtr = WIN_FindWndPtr( hwnd );
             if ((wndPtr->dwStyle & WS_VISIBLE) &&
                 (!(wndPtr->dwStyle & WS_DISABLED) ||
                  ((wndPtr->dwStyle & (WS_POPUP | WS_CHILD)) != WS_CHILD)) &&
@@ -201,7 +197,7 @@
                 (y >= wndPtr->rectWindow.top) &&
                 (y < wndPtr->rectWindow.bottom))
             {
-                *phwnd = hwnd;  /* Got a suitable window */
+                *ppWnd = wndPtr;  /* Got a suitable window */
 
                 /* If window is minimized or disabled, return at once */
                 if (wndPtr->dwStyle & WS_MINIMIZE) return HTCAPTION;
@@ -215,35 +211,34 @@
 
                 x -= wndPtr->rectClient.left;
                 y -= wndPtr->rectClient.top;
-                hwnd = wndPtr->hwndChild;
+                wndPtr = wndPtr->child;
             }
-            else hwnd = wndPtr->hwndNext;
+            else wndPtr = wndPtr->next;
         }
 
         /* If nothing found, return the desktop window */
-        if (!*phwnd)
+        if (!*ppWnd)
         {
-            *phwnd = GetDesktopWindow();
+            *ppWnd = WIN_GetDesktop();
             return HTCLIENT;
         }
-        wndPtr = WIN_FindWndPtr( *phwnd );
 
         /* Send the WM_NCHITTEST message (only if to the same task) */
-        if (wndPtr->hmemTaskQ != GetTaskQueue(0)) return HTCLIENT;
-        hittest = (INT)SendMessage( *phwnd, WM_NCHITTEST, 0,
+        if ((*ppWnd)->hmemTaskQ != GetTaskQueue(0)) return HTCLIENT;
+        hittest = (INT)SendMessage( (*ppWnd)->hwndSelf, WM_NCHITTEST, 0,
                                     MAKELONG( pt.x, pt.y ) );
         if (hittest != HTTRANSPARENT) return hittest;  /* Found the window */
 
         /* If no children found in last search, make point relative to parent*/
-        if (!hwnd)
+        if (!wndPtr)
         {
-            x += wndPtr->rectClient.left;
-            y += wndPtr->rectClient.top;
+            x += (*ppWnd)->rectClient.left;
+            y += (*ppWnd)->rectClient.top;
         }
 
         /* Restart the search from the next sibling */
-        hwnd = wndPtr->hwndNext;
-        *phwnd = wndPtr->hwndParent;
+        wndPtr = (*ppWnd)->next;
+        *ppWnd = wndPtr->parent;
     }
 }
 
@@ -253,9 +248,9 @@
  */
 HWND WindowFromPoint( POINT pt )
 {
-    HWND hwnd;
-    WINPOS_WindowFromPoint( pt, &hwnd );
-    return hwnd;
+    WND *pWnd;
+    WINPOS_WindowFromPoint( pt, &pWnd );
+    return pWnd->hwndSelf;
 }
 
 
@@ -293,31 +288,36 @@
     if( hwndFrom == hwndTo ) return;
 
       /* Translate source window origin to screen coords */
-    while(hwndFrom)
+    if (hwndFrom)
     {
-	if (!(wndPtr = WIN_FindWndPtr( hwndFrom )))
-	{
-	    fprintf( stderr, "MapWindowPoints: bad hwndFrom = "NPFMT"\n",
-		     hwndFrom); 
-	    return;
-	}
-	origin.x += wndPtr->rectClient.left;
-	origin.y += wndPtr->rectClient.top;
-	hwndFrom = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->hwndParent : 0;
+        if (!(wndPtr = WIN_FindWndPtr( hwndFrom )))
+        {
+            fprintf(stderr,"MapWindowPoints: bad hwndFrom = %04x\n",hwndFrom);
+            return;
+        }
+        while (wndPtr->parent)
+        {
+            origin.x += wndPtr->rectClient.left;
+            origin.y += wndPtr->rectClient.top;
+            wndPtr = wndPtr->parent;
+        }
     }
 
       /* Translate origin to destination window coords */
-    while(hwndTo)
+    if (hwndTo)
     {
-	if (!(wndPtr = WIN_FindWndPtr( hwndTo )))
-	{
-	    fprintf(stderr,"MapWindowPoints: bad hwndTo = "NPFMT"\n", hwndTo );
-	    return;
-	}
-	origin.x -= wndPtr->rectClient.left;
-	origin.y -= wndPtr->rectClient.top;
-	hwndTo = (wndPtr->dwStyle & WS_CHILD) ? wndPtr->hwndParent : 0;
-    }    
+        if (!(wndPtr = WIN_FindWndPtr( hwndTo )))
+        {
+            fprintf(stderr,"MapWindowPoints: bad hwndTo = %04x\n", hwndTo );
+            return;
+        }
+        while (wndPtr->parent)
+        {
+            origin.x -= wndPtr->rectClient.left;
+            origin.y -= wndPtr->rectClient.top;
+            wndPtr = wndPtr->parent;
+        }    
+    }
 
       /* Translate points */
     for (i = 0, curpt = lppt; i < count; i++, curpt++)
@@ -391,7 +391,7 @@
 {    
     int flags = SWP_NOZORDER | SWP_NOACTIVATE;
     if (!repaint) flags |= SWP_NOREDRAW;
-    dprintf_win(stddeb, "MoveWindow: "NPFMT" %d,%d %dx%d %d\n", 
+    dprintf_win(stddeb, "MoveWindow: %04x %d,%d %dx%d %d\n", 
 	    hwnd, x, y, cx, cy, repaint );
     return SetWindowPos( hwnd, 0, x, y, cx, cy, flags );
 }
@@ -410,7 +410,7 @@
 
     if (!wndPtr) return FALSE;
 
-    dprintf_win(stddeb,"ShowWindow: hwnd="NPFMT", cmd=%d\n", hwnd, cmd);
+    dprintf_win(stddeb,"ShowWindow: hwnd=%04x, cmd=%d\n", hwnd, cmd);
 
     wasVisible = (wndPtr->dwStyle & WS_VISIBLE) != 0;
 
@@ -717,11 +717,8 @@
     if (!(wndPtr->dwStyle & WS_CHILD))
     {
 	/* check Z-order and bring hWnd to the top */
-	wndTemp = WIN_FindWndPtr( GetDesktopWindow() );
-
-	for( ; wndTemp; wndTemp = WIN_FindWndPtr( wndTemp->hwndNext ))
-	    if( wndTemp->dwStyle & WS_VISIBLE )
-		break;
+	for (wndTemp = WIN_GetDesktop()->child; wndTemp; wndTemp = wndTemp->next)
+	    if (wndTemp->dwStyle & WS_VISIBLE) break;
 
 	if( wndTemp != wndPtr )
 	    SetWindowPos(hWnd, HWND_TOP, 0,0,0,0, 
@@ -761,18 +758,7 @@
 
     /* walk up to the first unowned window */
     wndTemp = wndPtr;
-
-    while(wndTemp->hwndOwner)
-    {
-	wndTemp = WIN_FindWndPtr(wndTemp->hwndOwner);
-	if( !wndTemp)
-        {
-	    /* there must be an unowned window in hierarchy */
-	    dprintf_win(stddeb,"WINPOS_ActivateWindow: broken owner list\n");
-	    wndTemp = wndPtr;
-	    break;
-        }
-    }
+    while (wndTemp->owner) wndTemp = wndTemp->owner;
     /* and set last active owned popup */
     wndTemp->hwndLastActive = hWnd;
 
@@ -829,8 +815,8 @@
 	return FALSE;
 
     /* switch desktop queue to current active here */
-    if( wndPtr->hwndParent == GetDesktopWindow())
-    { }
+    if( wndPtr->parent == WIN_GetDesktop())
+        WIN_GetDesktop()->hmemTaskQ = wndPtr->hmemTaskQ;
 
     return TRUE;
 }
@@ -898,8 +884,7 @@
 static void WINPOS_MoveWindowZOrder( HWND hwnd, HWND hwndAfter )
 {
     BOOL movingUp;
-    HWND hwndCur;
-    WND *wndPtr = WIN_FindWndPtr( hwnd );
+    WND *pWndAfter, *pWndCur, *wndPtr = WIN_FindWndPtr( hwnd );
 
     /* We have two possible cases:
      * - The window is moving up: we have to invalidate all areas
@@ -914,51 +899,50 @@
     }
     else if (hwndAfter == HWND_BOTTOM)
     {
-        if (!wndPtr->hwndNext) return;  /* Already at the bottom */
+        if (!wndPtr->next) return;  /* Already at the bottom */
         movingUp = FALSE;
     }
     else
     {
-        if (wndPtr->hwndNext == hwndAfter) return;  /* Already placed right */
+        if (!(pWndAfter = WIN_FindWndPtr( hwndAfter ))) return;
+        if (wndPtr->next == pWndAfter) return;  /* Already placed right */
 
           /* Determine which window we encounter first in Z-order */
-        hwndCur = GetWindow( wndPtr->hwndParent, GW_CHILD );
-        while ((hwndCur != hwnd) && (hwndCur != hwndAfter))
-            hwndCur = GetWindow( hwndCur, GW_HWNDNEXT );
-        movingUp = (hwndCur == hwndAfter);
+        pWndCur = wndPtr->parent->child;
+        while ((pWndCur != wndPtr) && (pWndCur != pWndAfter))
+            pWndCur = pWndCur->next;
+        movingUp = (pWndCur == pWndAfter);
     }
 
     if (movingUp)
     {
-        HWND hwndPrevAfter = wndPtr->hwndNext;
+        WND *pWndPrevAfter = wndPtr->next;
         WIN_UnlinkWindow( hwnd );
         WIN_LinkWindow( hwnd, hwndAfter );
-        hwndCur = wndPtr->hwndNext;
-        while (hwndCur != hwndPrevAfter)
+        pWndCur = wndPtr->next;
+        while (pWndCur != pWndPrevAfter)
         {
-            WND *curPtr = WIN_FindWndPtr( hwndCur );
-            RECT rect = curPtr->rectWindow;
+            RECT rect = pWndCur->rectWindow;
             OffsetRect( &rect, -wndPtr->rectClient.left,
                         -wndPtr->rectClient.top );
             RedrawWindow( hwnd, &rect, 0, RDW_INVALIDATE | RDW_ALLCHILDREN |
                           RDW_FRAME | RDW_ERASE );
-            hwndCur = curPtr->hwndNext;
+            pWndCur = pWndCur->next;
         }
     }
     else  /* Moving down */
     {
-        hwndCur = wndPtr->hwndNext;
+        pWndCur = wndPtr->next;
         WIN_UnlinkWindow( hwnd );
         WIN_LinkWindow( hwnd, hwndAfter );
-        while (hwndCur != hwnd)
+        while (pWndCur != wndPtr)
         {
-            WND *curPtr = WIN_FindWndPtr( hwndCur );
             RECT rect = wndPtr->rectWindow;
-            OffsetRect( &rect, -curPtr->rectClient.left,
-                        -curPtr->rectClient.top );
-            RedrawWindow( hwndCur, &rect, 0, RDW_INVALIDATE | RDW_ALLCHILDREN |
-                          RDW_FRAME | RDW_ERASE );
-            hwndCur = curPtr->hwndNext;
+            OffsetRect( &rect, -pWndCur->rectClient.left,
+                        -pWndCur->rectClient.top );
+            RedrawWindow( pWndCur->hwndSelf, &rect, 0, RDW_INVALIDATE |
+                          RDW_ALLCHILDREN | RDW_FRAME | RDW_ERASE );
+            pWndCur = pWndCur->next;
         }
     }
 }
@@ -1055,7 +1039,7 @@
         (hwndInsertAfter == HWND_NOTOPMOST)) hwndInsertAfter = HWND_TOP;
       /* hwndInsertAfter must be a sibling of the window */
     if ((hwndInsertAfter != HWND_TOP) && (hwndInsertAfter != HWND_BOTTOM) &&
-	(wndPtr->hwndParent != WIN_FindWndPtr(hwndInsertAfter)->hwndParent))
+	(wndPtr->parent != WIN_FindWndPtr(hwndInsertAfter)->parent))
         return FALSE;
 
       /* Fill the WINDOWPOS structure */
@@ -1133,7 +1117,7 @@
             HRGN hrgn2 = CreateRectRgnIndirect( &wndPtr->rectWindow );
             HRGN hrgn3 = CreateRectRgn( 0, 0, 0, 0 );
             CombineRgn( hrgn3, hrgn1, hrgn2, RGN_DIFF );
-            RedrawWindow( wndPtr->hwndParent, NULL, hrgn3,
+            RedrawWindow( wndPtr->parent->hwndSelf, NULL, hrgn3,
                           RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE );
 
 	    /* DCE_GetVisRgn should be called for old coordinates
@@ -1182,7 +1166,7 @@
         else
         {
             if (!(flags & SWP_NOREDRAW))
-                RedrawWindow( wndPtr->hwndParent, &wndPtr->rectWindow, 0,
+                RedrawWindow( wndPtr->parent->hwndSelf, &wndPtr->rectWindow, 0,
                               RDW_INVALIDATE | RDW_FRAME |
                               RDW_ALLCHILDREN | RDW_ERASE );
         }
@@ -1197,7 +1181,8 @@
 	    if (!IsWindow(newActive) || (newActive == winpos.hwnd))
 	    {
 		newActive = GetTopWindow( GetDesktopWindow() );
-		if (newActive == winpos.hwnd) newActive = wndPtr->hwndNext;
+		if (newActive == winpos.hwnd)
+                    newActive = wndPtr->next ? wndPtr->next->hwndSelf : 0;
 	    }	    
 	    WINPOS_ChangeActiveWindow( newActive, FALSE );
 	}
@@ -1219,7 +1204,7 @@
                       RDW_ALLCHILDREN | /*FIXME: this should not be necessary*/
                       RDW_INVALIDATE | RDW_FRAME | RDW_ERASE );
     if (!(flags & SWP_DEFERERASE))
-        RedrawWindow( wndPtr->hwndParent, NULL, 0,
+        RedrawWindow( wndPtr->parent->hwndSelf, NULL, 0,
                       RDW_ALLCHILDREN | RDW_ERASENOW );
 
       /* And last, send the WM_WINDOWPOSCHANGED message */
@@ -1268,10 +1253,11 @@
 
     pDWP = (DWP *) USER_HEAP_LIN_ADDR( hdwp );
     if (!pDWP) return 0;
+    if (hwnd == GetDesktopWindow()) return 0;
 
       /* All the windows of a DeferWindowPos() must have the same parent */
 
-    parent = WIN_FindWndPtr( hwnd )->hwndParent;
+    parent = WIN_FindWndPtr( hwnd )->parent->hwndSelf;
     if (pDWP->actualCount == 0) pDWP->hwndParent = parent;
     else if (parent != pDWP->hwndParent)
     {
@@ -1355,7 +1341,7 @@
  */
 void TileChildWindows( HWND parent, WORD action )
 {
-    printf("STUB TileChildWindows("NPFMT", %d)\n", parent, action);
+    printf("STUB TileChildWindows(%04x, %d)\n", parent, action);
 }
 
 /***********************************************************************
@@ -1363,5 +1349,5 @@
  */
 void CascadeChildWindows( HWND parent, WORD action )
 {
-    printf("STUB CascadeChildWindows("NPFMT", %d)\n", parent, action);
+    printf("STUB CascadeChildWindows(%04x, %d)\n", parent, action);
 }
