Release 960324

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.
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);
 }