diff --git a/ChangeLog b/ChangeLog
index ed36b23..1d12476 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,90 @@
 ----------------------------------------------------------------------
+Mon May 23 15:07:36 1994  Bob Amstadt  (bob@pooh)
+
+	* [loader/selector.c]
+	Allocate heap and stack segments as 64k.
+
+Sat May 21 01:15:49 1994  Rick Sladkey  (jrs@world.std.com)
+
+        * [loader/selector.c]
+        Correct typos where memcpy is used instead of memset.
+
+        * [loader/resource.c]
+        Allow for legitimate cases where biSizeImage is 0 in LoadIcon
+        by calculating the value when the bitmap is not compressed.
+
+        * [miscemu/int21.c]
+        Fix NULL dereference caused by superfluous DOS_closedir in FindNext.
+
+        * [loader/resource.c]
+        New function type_match to handle string resource types as
+        well as IDs.  In addition, compare only low 4 bits of type_id
+        when both numbers are IDs so that 0x0002 matches 0x8002.
+        In FindResourceByNumber and FindResourceByName use type_match
+        instead of comparing numbers.  In FindResource handle the
+        "#number" syntax and empty strings in both the resource and
+        type names.
+
+Mon May 23 00:48:25 1994  Rick Sladkey  (jrs@world.std.com)
+
+        * [windows/dialog.c]
+        Fix inadvertent printing of string IDs as strings.
+
+May 16, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
+
+	* [controls/menu.c]
+	New functions GetMenuItemCount(), GetMenuItemID().
+		GetMenuString() & HiliteMenuItem().
+	Bug fix in CheckMenuItem().
+	Function SetMenu() now make client area recalc if menu removed.
+
+	* [windows/winpos.c]
+	Bug fix in SetWindowPos(), no more XMapping or XConfiguring	of
+		windows with initial width or height equal zero.
+
+	* [objects/gdiobj.c]
+	New function EnumObjects(), using new lpPenBrushList buildup
+		from calls to new function GDI_AppendToPenBrushList().
+		('pbrush.exe' don't show its face yet ! ... :-( )
+	New EMPTY STUB for function SetObjectOwner(),
+		('mplayer.exe' call it via GetProcAddress() ...)
+
+	* [objects/font.c]
+	New internal functions ParseFontParms() & InitFontsList().
+	EnumFonts() & EnumFontFamilies() enumerates fonts (no more dummies).
+	FONT_MatchFont now make retries to find closest-smallest font.
+		('charmap.exe' can now show the differents fonts available)
+
+	* [windows/nonclient.c]
+	Use small dos OBM_OLD_CLOSE button for MDI windows.
+
+	* [windows/graphics.c] [objects/bitmap.c]
+	Start to remove obsolete globals such XT_screen ...
+
+	* [loader/library.c]
+	Make function GetProcAddress() working also with builtin DLLs.
+
+Tue May 24 20:18:02 1994  Erik Bos (erik@hacktic.nl)
+
+        * [if1632/system.spec] [if1632/toolhelp.spec]
+        system.dll & toolhelp.dll added.
+
+        * [loader/library.c]
+        Modified GetModuleFileName() to return the full
+        filename.
+        Added a check to LoadLibrary() to prevent loading
+        built in dlls. (eg. user.exe)
+        Added a check to FreeLibrary() to prevent built-in
+        dlls from being freed.
+        Modified GetProcAddress() to support builtin dlls.
+
+        * [loader/signal.c] [miscemu/int2f.c]
+        Added => pifedit runs.
+
+        * [misc/dos_fs.c]
+        Added a NULL-ptr check to DOS_closedir().
+
+----------------------------------------------------------------------
 Tue May 17 23:03:16 1994  Bob Amstadt  (bob@pooh)
 
 	* [windows/dce.c]
diff --git a/LICENSE b/LICENSE
index 3854e93..88add0b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1 +1,30 @@
-All code unless stated otherwise is covered by the GNU Pubic License.
+You may without charge, royalty or other payment, copy and
+distribute copies of this work and derivative works of this work
+in source or binary form provided that: (1) 
+you appropriately publish on each copy an appropriate copyright
+notice; (2) faithfully reproduce all prior copyright notices
+included in the original work (you may also add your own
+copyright notice); and (3) agree to indemnify and hold all prior
+authors, copyright holders and licensors of the work harmless
+from and against all damages arising from use of the work.
+
+You may distribute sources of derivative works of the work
+provided that (1) (a) all source files of the original work that
+have been modified, (b) all source files of the derivative work
+that contain any party of the original work, and (c) all source
+files of the derivative work that are necessary to compile, link
+and run the derivative work without unresolved external calls and
+with the same functionality of the original work ("Necessary
+Sources") carry a prominent notice explaining the nature and date
+of the modification and/or creation.  You are encouraged to make
+the Necessary Sources available under this license in order to
+further the development and acceptance of the work.
+
+EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED
+WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING
+BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A
+PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE.  EXCEPT AS
+OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR
+LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
diff --git a/README b/README
index 1d735be..4df0e04 100644
--- a/README
+++ b/README
@@ -1,8 +1,34 @@
-Copyright  Robert J. Amstadt, 1993.  All code is provided without
-warranty.  All code is covered by the license contained in the file
-LICENSE unless explicitly stated in the individual source file.
+0. LICENSE
 
+You may without charge, royalty or other payment, copy and
+distribute copies of this work and derivative works of this work
+in source or binary form provided that: (1) 
+you appropriately publish on each copy an appropriate copyright
+notice; (2) faithfully reproduce all prior copyright notices
+included in the original work (you may also add your own
+copyright notice); and (3) agree to indemnify and hold all prior
+authors, copyright holders and licensors of the work harmless
+from and against all damages arising from use of the work.
 
+You may distribute sources of derivative works of the work
+provided that (1) (a) all source files of the original work that
+have been modified, (b) all source files of the derivative work
+that contain any party of the original work, and (c) all source
+files of the derivative work that are necessary to compile, link
+and run the derivative work without unresolved external calls and
+with the same functionality of the original work ("Necessary
+Sources") carry a prominent notice explaining the nature and date
+of the modification and/or creation.  You are encouraged to make
+the Necessary Sources available under this license in order to
+further the development and acceptance of the work.
+
+EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED
+WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING
+BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A
+PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE.  EXCEPT AS
+OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR
+LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 
 1. COMPILATION:
 
@@ -171,6 +197,11 @@
 
 7. WHAT'S NEW
 
+WHAT'S NEW with Wine-940524: (see ChangeLog for details)
+	- New menu functions
+	- EnumObjects()
+	- and many many bug fixes!
+
 WHAT'S NEW with Wine-940518: (see ChangeLog for details)
 	- debugger improvements
 	- bug fixes to get some dialog boxes working.
diff --git a/controls/Imakefile b/controls/Imakefile
index 2615294..4556b4c 100644
--- a/controls/Imakefile
+++ b/controls/Imakefile
@@ -9,7 +9,7 @@
 	menu.c \
 	scroll.c \
 	static.c \
-	edit.o \
+	edit.c \
 	desktop.c \
 	widgets.c
 
diff --git a/controls/combo.c b/controls/combo.c
index 48d0519..22a1b08 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -263,7 +263,9 @@
 		if (lphc == NULL) return 0;
 		return(SendMessage(lphc->hWndLBox, LB_ADDSTRING, wParam, lParam));
     case CB_GETLBTEXT:
+#ifdef DEBUG_COMBO
 		printf("CB_GETLBTEXT #%u !\n", wParam);
+#endif
 		lphc = ComboGetStorageHeader(hwnd);
 		if (lphc == NULL) return 0;
 		return(SendMessage(lphc->hWndLBox, LB_GETTEXT, wParam, lParam));
diff --git a/controls/edit.c b/controls/edit.c
index 5528247..5e43c3b 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -309,7 +309,6 @@
 	break;
 
     case WM_KEYDOWN:
-	printf("EDIT WM_KEYDOWN w=%04X !\n", wParam);
 	EDIT_KeyDownMsg(hwnd, wParam);
 	break;
 
diff --git a/controls/menu.c b/controls/menu.c
index e41c968..dd9c880 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -14,6 +14,7 @@
 #include "sysmetrics.h"
 #include "prototypes.h"
 #include "menu.h"
+#include "user.h"
 #include "heap.h"
 #include "win.h"
 
@@ -50,6 +51,7 @@
 LPSTR GetShortCutString(LPSTR str);
 WORD GetShortCutPos(LPSTR str);
 BOOL HideAllSubPopupMenu(LPPOPUPMENU menu);
+void InitStdBitmaps();
 HMENU CopySysMenu();
 WORD * ParseMenuResource(WORD *first_item, int level, HMENU hMenu);
 void SetMenuLogicalParent(HMENU hMenu, HWND hWnd);
@@ -84,10 +86,7 @@
 #ifdef DEBUG_MENU
 		printf("PopupMenu WM_CREATE lppop=%08X !\n", lppop);
 #endif
-		if (hStdCheck == (HBITMAP)NULL) 
-			hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
-		if (hStdMnArrow == (HBITMAP)NULL) 
-			hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
+		InitStdBitmaps();
 #ifdef DEBUG_MENU
 		printf("PopupMenu End of WM_CREATE !\n");
 #endif
@@ -215,6 +214,7 @@
 					ShowWindow(hwnd, SW_HIDE);
 					hwnd = lppop->hWndParent;
 					lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+					printf("VK_LEFT // try to put focus on MenuBar %08X !\n", lppop);
 					if (lppop == NULL) break;
 					MenuItemSelect(hwnd, lppop, lppop->nItems - 1);
 				    break;
@@ -241,6 +241,7 @@
 					ShowWindow(hwnd, SW_HIDE);
 					hwnd = lppop->hWndParent;
 					lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+					printf("VK_RIGHT // try to put focus on MenuBar %08X !\n", lppop);
 					if (lppop == NULL) break;
 					MenuItemSelect(hwnd, lppop, 0);
 				    break;
@@ -262,11 +263,6 @@
 				    }
 				MenuItemSelect(hwnd, lppop, lppop->FocusedItem + 1);
 				break;
-			case VK_RETURN:
-			case VK_SPACE:
-ProceedSPACE:	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
-				ExecFocusedMenuItem(hwnd, lppop);
-				break;
 			default:
 				break;
 			}
@@ -280,6 +276,11 @@
 		lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
 		if (lppop == NULL) break;
 		switch(wParam) {
+			case VK_RETURN:
+			case VK_SPACE:
+ProceedSPACE:	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+				ExecFocusedMenuItem(hwnd, lppop);
+				break;
 			case VK_ESCAPE:
 				if (lppop->BarFlag) {
 #ifdef DEBUG_MENU
@@ -686,6 +687,7 @@
 		EndPaint(hwnd, &ps);
 		return;
 		}
+	InitStdBitmaps();
 	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
 	if (lppop == NULL) goto EndOfPaint;
 	hBrush = GetStockObject(WHITE_BRUSH);
@@ -734,8 +736,13 @@
 		hMemDC = CreateCompatibleDC(hDC);
 		SelectObject(hMemDC, hBitMap);
 		GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+#ifdef DEBUG_MENU
+		printf("StdDrawPopupMenu // MF_BITMAP hBit=%04X w=%d h=%d\n",
+				hBitMap, bm.bmWidth, bm.bmHeight);
+#endif
 		BitBlt(hDC, rect2.left, rect2.top,
-		bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+				bm.bmWidth, bm.bmHeight, 
+				hMemDC, 0, 0, SRCCOPY);
 		DeleteDC(hMemDC);
 		if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
 			InvertRect(hDC, &lpitem->rect);
@@ -812,9 +819,7 @@
 	printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
 #endif
 	MenuBarCalcSize(hDC, lprect, lppop);
-	if (suppress_draw)
-	    return;
-	
+	if (suppress_draw) return;
 	hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
 	hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
 	hBrush = GetStockObject(WHITE_BRUSH);
@@ -855,8 +860,13 @@
 			hMemDC = CreateCompatibleDC(hDC);
 			SelectObject(hMemDC, hBitMap);
 			GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
+#ifdef DEBUG_MENU
+			printf("StdDrawMenuBar // MF_BITMAP hBit=%04X w=%d h=%d\n",
+					hBitMap, bm.bmWidth, bm.bmHeight);
+#endif
 			BitBlt(hDC, rect2.left, rect2.top,
-			bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+						bm.bmWidth, bm.bmHeight, 
+						hMemDC, 0, 0, SRCCOPY);
 			DeleteDC(hMemDC);
 			}
 		if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
@@ -955,6 +965,7 @@
 #ifdef DEBUG_MENUCALC
 	printf("PopupMenuCalcSize hWnd=%04X !\n", hWnd);
 #endif
+	InitStdBitmaps();
 	lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
 	if (lppop == NULL) return;
 	if (lppop->nItems == 0) return;
@@ -1039,6 +1050,7 @@
 	DWORD	dwRet;
 	if (lppop == NULL) return;
 	if (lppop->nItems == 0) return;
+	InitStdBitmaps();
 #ifdef DEBUG_MENUCALC
 	printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n", 
 		lprect->left, lprect->top, lprect->right, lprect->bottom);
@@ -1245,29 +1257,21 @@
  */
 BOOL CheckMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
-	WND		*wndPtr;
-	LPPOPUPMENU	menu;
 	LPMENUITEM 	lpitem;
-	int		i;
 #ifdef DEBUG_MENU
 	printf("CheckMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
 #endif
-	menu = (LPPOPUPMENU) GlobalLock(hMenu);
-	if (menu == NULL) return FALSE;
-	lpitem = menu->firstItem;
-	for (i = 0; i < menu->nItems; i++) {
-		if (lpitem == NULL) break;
-		if (i == wItemID) {
-			if (wFlags && MF_CHECKED)
-				lpitem->item_flags |= MF_CHECKED;
-			else
-				lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
-			GlobalUnlock(hMenu);
-			return(TRUE);
-			}
-		lpitem = (LPMENUITEM)lpitem->next;
+	lpitem = FindMenuItem(hMenu, wItemID, wFlags);
+	if (lpitem != NULL) {
+		if ((wFlags & MF_CHECKED) == MF_CHECKED)
+			lpitem->item_flags |= MF_CHECKED;
+		else
+			lpitem->item_flags &= ((WORD)-1 ^ MF_CHECKED);
+#ifdef DEBUG_MENU
+		printf("CheckMenuItem // Found !\n");
+#endif
+		return(TRUE);
 		}
-	GlobalUnlock(hMenu);
 	return FALSE;
 }
 
@@ -1277,30 +1281,113 @@
  */
 BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
 {
-	WND		*wndPtr;
-	LPPOPUPMENU	menu;
 	LPMENUITEM 	lpitem;
-	int		i;
 #ifdef DEBUG_MENU
 	printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
 #endif
+	lpitem = FindMenuItem(hMenu, wItemID, wFlags);
+	if (lpitem != NULL) {
+		if (wFlags && MF_DISABLED)
+			lpitem->item_flags |= MF_DISABLED;
+		else
+			lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
+#ifdef DEBUG_MENU
+		printf("EnableMenuItem // Found !\n");
+#endif
+		return(TRUE);
+		}
+	return FALSE;
+}
+
+
+/**********************************************************************
+ *			GetMenuString		[USER.161]
+ */
+int GetMenuString(HMENU hMenu, WORD wItemID, 
+	LPSTR str, short nMaxSiz, WORD wFlags)
+{
+	LPMENUITEM 	lpitem;
+	int		maxsiz;
+#ifdef DEBUG_MENU
+	printf("GetMenuString(%04X, %04X, %08X, %d, %04X);\n",
+					hMenu, wItemID, str, nMaxSiz, wFlags);
+#endif
+	if (str == NULL) return FALSE;
+	lpitem = FindMenuItem(hMenu, wItemID, wFlags);
+	if (lpitem != NULL) {
+		if (lpitem->item_text != NULL) {
+			maxsiz = min(nMaxSiz - 1, strlen(lpitem->item_text));
+			strncpy(str, lpitem->item_text, maxsiz + 1);
+			}
+		else
+			maxsiz = 0;
+#ifdef DEBUG_MENU
+		printf("GetMenuString // Found !\n");
+#endif
+		return maxsiz;
+		}
+	return 0;
+}
+
+
+/**********************************************************************
+ *			HiliteMenuItem		[USER.162]
+ */
+BOOL HiliteMenuItem(HWND hWnd, HMENU hMenu, WORD wItemID, WORD wHilite)
+{
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	printf("HiliteMenuItem(%04X, %04X, %04X, %04X);\n", 
+						hWnd, hMenu, wItemID, wHilite);
 	menu = (LPPOPUPMENU) GlobalLock(hMenu);
 	if (menu == NULL) return FALSE;
+	lpitem = FindMenuItem(hMenu, wItemID, wHilite);
+	if (lpitem == NULL) return FALSE;
+	return FALSE;
+}
+
+
+/**********************************************************************
+ *			GetMenuItemCount		[USER.263]
+ */
+WORD GetMenuItemCount(HMENU hMenu)
+{
+	LPPOPUPMENU	menu;
+#ifdef DEBUG_MENU
+	printf("GetMenuItemCount(%04X);\n", hMenu);
+#endif
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return (WORD)-1;
+#ifdef DEBUG_MENU
+	printf("GetMenuItemCount(%04X) return %d \n", hMenu, menu->nItems);
+#endif
+	return menu->nItems;
+}
+
+
+/**********************************************************************
+ *			GetMenuItemID			[USER.264]
+ */
+WORD GetMenuItemID(HMENU hMenu, int nPos)
+{
+	WORD		i;
+	LPPOPUPMENU	menu;
+	LPMENUITEM 	lpitem;
+	printf("GetMenuItemID(%04X, %d);\n", hMenu, nPos);
+	menu = (LPPOPUPMENU) GlobalLock(hMenu);
+	if (menu == NULL) return -1;
 	lpitem = menu->firstItem;
 	for (i = 0; i < menu->nItems; i++) {
 		if (lpitem == NULL) break;
-		if (i == wItemID) {
-			if (wFlags && MF_DISABLED)
-				lpitem->item_flags |= MF_DISABLED;
-			else
-				lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
-			GlobalUnlock(hMenu);
-			return(TRUE);
+		if (i == nPos) {
+#ifdef DEBUG_MENU
+			printf("GetMenuItemID // Found !\n");
+#endif
+			return lpitem->item_id;
 			}
 		lpitem = (LPMENUITEM)lpitem->next;
 		}
-	GlobalUnlock(hMenu);
-	return FALSE;
+	return -1;
 }
 
 
@@ -1309,13 +1396,11 @@
  */
 BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
 {
-	WND		*wndPtr;
 	LPPOPUPMENU	menu;
 	HANDLE	hNewItem;
 	LPMENUITEM 	lpitem, lpitem2;
-	int		i;
 #ifdef DEBUG_MENU
-	if (wFlags & MF_STRING) 
+	if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
 		printf("InsertMenu (%04X, %04X, %04X, '%s') !\n",
 					hMenu, wFlags, wItemID, lpNewItem);
 	else
@@ -1377,7 +1462,6 @@
  */
 BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
 {
-	WND		*wndPtr;
 	LPPOPUPMENU	menu;
 	HANDLE	hNewItem;
 	LPMENUITEM 	lpitem, lpitem2;
@@ -1445,7 +1529,6 @@
  */
 BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags)
 {
-	WND		*wndPtr;
 	LPPOPUPMENU	menu;
 	LPMENUITEM 	lpitem;
 	int		i;
@@ -1521,13 +1604,16 @@
  */
 BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem)
 {
-	WND		*wndPtr;
 	LPPOPUPMENU	menu;
 	LPMENUITEM 	lpitem;
 	int		i;
 #ifdef DEBUG_MENU
-	printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n",
-				hMenu, nPos, wFlags, wItemID, lpNewItem);
+	if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0)
+		printf("ModifyMenu (%04X, %04X, %04X, %04X, '%s') !\n",
+					hMenu, nPos, wFlags, wItemID, lpNewItem);
+	else
+		printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n",
+					hMenu, nPos, wFlags, wItemID, lpNewItem);
 #endif
 	menu = (LPPOPUPMENU) GlobalLock(hMenu);
 	if (menu == NULL) return FALSE;
@@ -1593,6 +1679,9 @@
 	menu->Width 		= 100;
 	menu->Height 		= 0;
 	GlobalUnlock(hMenu);
+#ifdef DEBUG_MENU
+	printf("CreatePopupMenu // return %04X\n", hMenu);
+#endif
 	return hMenu;
 }
 
@@ -1692,7 +1781,6 @@
 
 BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu)
 {
-	WND		*wndPtr;
 	MSG		msg;
 #ifdef DEBUG_MENU
 	printf("Enter in Menu Focus Loop !\n");
@@ -1808,8 +1896,7 @@
 DWORD GetMenuCheckMarkDimensions()
 {
     BITMAP	bm;
-    if (hStdCheck == (HBITMAP)NULL) 
-	hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+	InitStdBitmaps();
     GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
     return MAKELONG(bm.bmWidth, bm.bmHeight);
 }
@@ -1821,7 +1908,6 @@
 BOOL SetMenuItemBitmaps(HMENU hMenu, WORD nPos, WORD wFlags,
 		HBITMAP hNewCheck, HBITMAP hNewUnCheck)
 {
-	WND		*wndPtr;
 	LPPOPUPMENU	menu;
 	LPMENUITEM 	lpitem;
 	int		i;
@@ -1856,7 +1942,7 @@
 	HMENU	hMenu;
 	LPPOPUPMENU menu;
 #ifdef DEBUG_MENU
-	printf("CreatePopupMenu !\n");
+	printf("CreateMenu !\n");
 #endif
 	hMenu = GlobalAlloc(GMEM_MOVEABLE, sizeof(POPUPMENU));
 	menu = (LPPOPUPMENU) GlobalLock(hMenu);
@@ -1877,6 +1963,9 @@
 	menu->Width 		= 100;
 	menu->Height 		= 0;
 	GlobalUnlock(hMenu);
+#ifdef DEBUG_MENU
+	printf("CreateMenu // return %04X\n", hMenu);
+#endif
 	return hMenu;
 }
 
@@ -1983,7 +2072,10 @@
  */
 BOOL SetMenu(HWND hWnd, HMENU hMenu)
 {
+	RECT	rect;
 	LPPOPUPMENU lpmenu;
+	NCCALCSIZE_PARAMS *params;
+	HANDLE hparams;
 	WND * wndPtr = WIN_FindWndPtr(hWnd);
 	if (wndPtr == NULL) {
 		printf("SetMenu(%04X, %04X) // Bad window handle !\n", hWnd, hMenu);
@@ -1992,7 +2084,22 @@
 #ifdef DEBUG_MENU
 	printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
 #endif
+	if (GetCapture() == hWnd) ReleaseCapture();
 	wndPtr->wIDmenu = hMenu;
+	if (hMenu == 0) {
+		printf("SetMenu(%04X, %04X) // Menu removed !\n", hWnd, hMenu);
+		hparams = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(NCCALCSIZE_PARAMS));
+		if (hparams) {
+			params = (NCCALCSIZE_PARAMS *) USER_HEAP_ADDR(hparams);
+			params->rgrc[0] = wndPtr->rectWindow;
+			params->lppos = NULL;
+			SendMessage(hWnd, WM_NCCALCSIZE, FALSE, (LONG)params);
+			wndPtr->rectClient = params->rgrc[0];
+			USER_HEAP_FREE(hparams);
+			}	
+		SendMessage(hWnd, WM_NCPAINT, 0, 0L);
+		return TRUE;
+		}
 	lpmenu = (LPPOPUPMENU) GlobalLock(hMenu);
 	if (lpmenu == NULL) {
 		printf("SetMenu(%04X, %04X) // Bad menu handle !\n", hWnd, hMenu);
@@ -2000,7 +2107,6 @@
 		}
 	lpmenu->ownerWnd = hWnd;
 	ResetHiliteFlags(lpmenu);
-	if (GetCapture() == hWnd) ReleaseCapture();
 	GlobalUnlock(hMenu);
 	return TRUE;
 }
@@ -2093,6 +2199,18 @@
 
 
 /**********************************************************************
+ *			InitStdBitmaps (Internal)
+ */
+void InitStdBitmaps()
+{
+	if (hStdCheck == (HBITMAP)NULL) 
+		hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+	if (hStdMnArrow == (HBITMAP)NULL) 
+		hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
+}
+
+
+/**********************************************************************
  *			CopySysMenu (Internal)
  */
 HMENU CopySysMenu()
diff --git a/if1632/Imakefile b/if1632/Imakefile
index d1ff205..601424d 100644
--- a/if1632/Imakefile
+++ b/if1632/Imakefile
@@ -16,6 +16,8 @@
 	dll_shell.o \
 	dll_sound.o \
 	dll_stress.o \
+	dll_system.o \
+	dll_toolhelp.o \
 	dll_unixlib.o \
 	dll_user.o \
 	dll_win87em.o \
@@ -39,6 +41,8 @@
 MakeDllFromSpec(mmsystem,$(TOP)/$(MODULE))
 MakeDllFromSpec(sound,$(TOP)/$(MODULE))
 MakeDllFromSpec(stress,$(TOP)/$(MODULE))
+MakeDllFromSpec(system,$(TOP)/$(MODULE))
+MakeDllFromSpec(toolhelp,$(TOP)/$(MODULE))
 MakeDllFromSpec(unixlib,$(TOP)/$(MODULE))
 MakeDllFromSpec(user,$(TOP)/$(MODULE))
 MakeDllFromSpec(win87em,$(TOP)/$(MODULE))
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 10c2ba9..82247c5 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -85,7 +85,7 @@
 68  pascal DeleteDC(word) DeleteDC(1)
 69  pascal DeleteObject(word) DeleteObject(1)
 70  pascal EnumFonts(word ptr ptr ptr) EnumFonts(1 2 3 4)
-#71  pascal EnumObjects
+71  pascal EnumObjects(word word ptr ptr) EnumObjects(1 2 3 4)
 72  pascal EqualRgn(word word) EqualRgn(1 2)
 73  pascal ExcludeVisRect(word s_word s_word s_word s_word)
 	   ExcludeVisRect(1 2 3 4 5)
@@ -136,8 +136,8 @@
 129 pascal SaveVisRgn(word) SaveVisRgn(1)
 130 pascal RestoreVisRgn(word) RestoreVisRgn(1)
 131 pascal InquireVisRgn(word) InquireVisRgn(1)
-#132 pascal SetEnvironment
-#133 pascal GetEnvironment
+132 pascal SetEnvironment(ptr ptr word) SetEnvironment(1 2 3)
+133 pascal GetEnvironment(ptr ptr word) GetEnvironment(1 2 3)
 134 pascal GetRgnBox(word ptr) GetRgnBox(1 2)
 #135 pascal ScanLr
 #136 pascal RemoveFontResource
@@ -276,7 +276,7 @@
 	   CreatePolyPolygonRgn(1 2 3 4)
 #452 pascal GDISEEGDIDO
 #460 pascal GDITASKTERMINATION
-#461 pascal SETOBJECTOWNER
+461 pascal SetObjectOwner(word) SetObjectOwner(1)
 #462 pascal ISGDIOBJECT
 #463 pascal MAKEOBJECTPRIVATE
 #464 pascal FIXUPBOGUSPUBLISHERMETAFILE
diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index b9d01e7..22bdf46 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -67,8 +67,33 @@
 509    pascal  WAVEINSTART(word) waveInStart(1)
 510    pascal  WAVEINSTOP(word) waveInStop(1)
 511    pascal  WAVEINRESET(word) waveInReset(1)
+512    pascal  WAVEINGETPOSITION(word ptr word) waveInGetPosition(1 2 3)
 513    pascal  WAVEINGETID(word ptr) waveInGetID(1 2)
 701    pascal  MCISENDCOMMAND(word word long long) mciSendCommand(1 2 3 4)
 702    pascal  MCISENDSTRING(ptr ptr word word) mciSendString(1 2 3 4)
 703    pascal  MCIGETDEVICEID(ptr) mciSendCommand(1)
 706    pascal  MCIGETERRORSTRING(long ptr word) mciGetErrorString(1 2 3)
+#1100   pascal  DRVOPEN
+#1101   pascal  DRVCLOSE
+#1102   pascal  DRVSENDMESSAGE
+#1103   pascal  DRVGETMODULEHANDLE
+#1104   pascal  DRVDEFDRIVERPROC
+#1210   pascal  MMIOOPEN
+#1211   pascal  MMIOCLOSE
+#1212   pascal  MMIOREAD
+#1213   pascal  MMIOWRITE
+#1214   pascal  MMIOSEEK
+#1215   pascal  MMIOGETINFO
+#1216   pascal  MMIOSETINFO
+#1217   pascal  MMIOSETBUFFER
+#1218   pascal  MMIOFLUSH
+#1219   pascal  MMIOADVANCE
+#1220   pascal  MMIOSTRINGTOFOURCC
+#1221   pascal  MMIOINSTALLIOPROC
+#1222   pascal  MMIOSENDMESSAGE
+#1223   pascal  MMIODESCEND
+#1224   pascal  MMIOASCEND
+#1225   pascal  MMIOCREATECHUNK
+#1226   pascal  MMIORENAME
+
+
diff --git a/if1632/relay.c b/if1632/relay.c
index f5b08b0..ddbf8c9 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -24,8 +24,6 @@
 
 #define DEBUG_RELAY /* */
 
-#define N_BUILTINS	11
-
 struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] =
 {
     { "KERNEL",  KERNEL_table, 	410, 1 },
@@ -39,7 +37,10 @@
     { "WINSOCK", WINSOCK_table, 155, 9 },
     { "STRESS",  STRESS_table,   15, 10},
     { "MMSYSTEM",MMSYSTEM_table,1023,11},
+    { "SYSTEM",  SYSTEM_table,   20 ,12},
+    { "TOOLHELP",TOOLHELP_table, 83, 13},
 };
+/* don't forget to increase N_BUILTINS in dll.h if you add a dll */
 
 unsigned short *Stack16Frame;
 
@@ -220,7 +221,7 @@
     int i;
 
     for (i = 0; i < N_BUILTINS; i++)
-	if (strcmp(dll_builtin_table[i].dll_name, dll_name) == 0)
+	if (strcasecmp(dll_builtin_table[i].dll_name, dll_name) == 0)
 	    return dll_builtin_table[i].dll_table;
     
     return NULL;
diff --git a/if1632/user.spec b/if1632/user.spec
index 1bb9eed..2b4c0ee 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -163,8 +163,8 @@
 158 pascal SetMenu(word word) SetMenu(1 2)
 159 pascal GetSubMenu(word word) GetSubMenu(1 2)
 160 pascal DrawMenuBar(word) DrawMenuBar(1)
-#161 GETMENUSTRING
-#162 HILITEMENUITEM
+161 pascal GetMenuString(word word ptr s_word word) GetMenuString(1 2 3 4 5)
+162 pascal HiliteMenuItem(word word word word) HiliteMenuItem(1 2 3 4)
 163 pascal CreateCaret(word word word word) CreateCaret(1 2 3 4)
 164 pascal DestroyCaret() DestroyCaret()
 165 pascal SetCaretPos(word word) SetCaretPos(1 2)
@@ -272,8 +272,8 @@
 #260 DEFERWINDOWPOS
 #261 ENDDEFERWINDOWPOS
 262 pascal GetWindow(word word) GetWindow(1 2)
-#263 GETMENUITEMCOUNT
-#264 GETMENUITEMID
+263 pascal GetMenuItemCount(word) GetMenuItemCount(1)
+264 pascal GetMenuItemID(word word) GetMenuItemID(1 2)
 #265 SHOWOWNEDPOPUPS
 266 pascal SetMessageQueue(word) SetMessageQueue(1)
 267 pascal ShowScrollBar(word word word) ShowScrollBar(1 2 3)
diff --git a/include/dlls.h b/include/dlls.h
index 9c59b48..574db1e 100644
--- a/include/dlls.h
+++ b/include/dlls.h
@@ -65,5 +65,9 @@
 extern struct dll_table_entry_s KEYBOARD_table[];
 extern struct dll_table_entry_s WINSOCK_table[];
 extern struct dll_table_entry_s STRESS_table[];
+extern struct dll_table_entry_s SYSTEM_table[];
+extern struct dll_table_entry_s TOOLHELP_table[];
+
+#define N_BUILTINS	13
 
 #endif /* DLLS_H */
diff --git a/include/gdi.h b/include/gdi.h
index 27b4d3d..1920d07 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -301,8 +301,6 @@
 extern GDIOBJHDR * GDI_GetObjPtr( HANDLE, WORD );
 
 extern Display * XT_display;  /* Will be removed */
-extern Screen * XT_screen;    /* Will be removed */
-
 extern Display * display;
 extern Screen * screen;
 extern Window rootWindow;
diff --git a/include/windows.h b/include/windows.h
index 0b27568..96a29fe 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -2975,7 +2975,7 @@
 Fe(int,Escape,HDC,a,int,b,int,c,LPSTR,d,LPSTR,e)
 Fe(int,ExcludeClipRect,HDC,a,short,b,short,c,short,d,short,e)
 Fe(int,ExcludeVisRect,HDC,a,short,b,short,c,short,d,short,e)
-Fe(int,GetMenuString,HMENU,a,WORD,b,LPSTR,c,int,d,WORD,e)
+Fe(int,GetMenuString,HMENU,a,WORD,b,LPSTR,c,short,d,WORD,e)
 Fe(int,GetProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d,int,e)
 Fe(int,IntersectClipRect,HDC,a,short,b,short,c,short,d,short,e)
 Fe(int,IntersectVisRect,HDC,a,short,b,short,c,short,d,short,e)
diff --git a/loader/library.c b/loader/library.c
index 6cfbe08..c53f003 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -35,9 +35,9 @@
 static LPMODULEENTRY lpModList = NULL;
 
 extern struct  w_files * wine_files;
-#define N_BUILTINS	11
-extern struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS];
+extern struct dll_name_table_entry_s dll_builtin_table[];
 
+#define IS_BUILTIN_DLL(handle) ((handle >> 16) == 0xff) 
 
 /**********************************************************************
  *				GetModuleHandle	[KERNEL.47]
@@ -50,7 +50,7 @@
  	printf("GetModuleHandle // searching in loaded modules\n");
 	while (w) {
 /*		printf("GetModuleHandle // '%s' \n", w->name);  */
-		if (strcmp(w->name, lpModuleName) == 0) {
+		if (strcasecmp(w->name, lpModuleName) == 0) {
 			printf("GetModuleHandle('%s') return %04X \n", 
 							lpModuleName, w->hinstance);
 			return w->hinstance;
@@ -60,7 +60,7 @@
  	printf("GetModuleHandle // searching in builtin libraries\n");
     for (i = 0; i < N_BUILTINS; i++) {
 		if (dll_builtin_table[i].dll_name == NULL) break;
-		if (strcmp(dll_builtin_table[i].dll_name, lpModuleName) == 0) {
+		if (strcasecmp(dll_builtin_table[i].dll_name, lpModuleName) == 0) {
 			printf("GetModuleHandle('%s') return %04X \n", 
 							lpModuleName, 0xFF00 + i);
 			return (0xFF00 + i);
@@ -90,17 +90,30 @@
 int GetModuleFileName(HANDLE hModule, LPSTR lpFileName, short nSize)
 {
     struct w_files *w;
-	LPSTR		str;
+    LPSTR str;
+    char windir[256], temp[256];
+
     printf("GetModuleFileName(%04X, %08X, %d);\n", hModule, lpFileName, nSize);
+
     if (lpFileName == NULL) return 0;
-	if (nSize < 1) return 0;
-    w = GetFileInfo(hModule);
-    if (w == NULL) return 0;
-	str = w->filename;
-	if (str[0] == '/') str++;
+    if (nSize < 1) return 0;
+
+    /* built-in dll ? */
+    if (IS_BUILTIN_DLL(hModule)) {
+	GetWindowsDirectory(windir, sizeof(windir));
+	sprintf(temp, "%s\\%s.DLL", windir, dll_builtin_table[hModule & 0x00ff].dll_name);
+	ToDos(temp);
+	strncpy(lpFileName, temp, nSize);
+        printf("GetModuleFileName copied '%s' (internal dll) return %d \n", lpFileName, nSize);
+	return strlen(lpFileName);
+    }
+
+    /* check loaded dlls */
+    if ((w = GetFileInfo(hModule)) == NULL)
+    	return 0;
+    str = GetDosFileName(w->filename);
     if (nSize > strlen(str)) nSize = strlen(str) + 1;
     strncpy(lpFileName, str, nSize);
-	ToDos(lpFileName);
     printf("GetModuleFileName copied '%s' return %d \n", lpFileName, nSize);
     return nSize - 1;
 }
@@ -114,14 +127,31 @@
     HANDLE hModule;
     LPMODULEENTRY lpMod = lpModList;
     LPMODULEENTRY lpNewMod;
-
-    if (FindDLLTable(libname))
-    {
-    printf("Library was a builtin - returning 0x23\n");
-	return WINE_CODE_SELECTOR;
-    }
+    int i;
+    char temp[64];
 
     printf("LoadLibrary '%s'\n", libname);
+
+    /* extract dllname */
+    strcpy(temp, libname);
+    if (strchr(temp, '\\') || strchr(temp, '/'))
+	for (i = strlen(temp) - 1; i ; i--) 
+		if (temp[i] == '\\' || temp[i] == '/') {
+			strcpy(temp, temp + i + 1);
+			break;
+		}
+    for (i = strlen(temp) - 1; i ; i--) 
+	if (temp[i] == '.') {
+		temp[i] = 0;
+		break;
+	}
+    
+    if (FindDLLTable(temp))
+	{
+	printf("Library was a builtin - \n");
+	return GetModuleHandle(temp);
+	}
+
     if (lpMod != NULL) 
     {
 	while (TRUE) 
@@ -176,7 +206,13 @@
 void FreeLibrary(HANDLE hLib)
 {
 	LPMODULEENTRY lpMod = lpModList;
+
     printf("FreeLibrary(%04X);\n", hLib);
+
+	/* built-in dll ? */
+	if (IS_BUILTIN_DLL(hLib)) 
+	    	return;
+
 	while (lpMod != NULL) {
 		if (lpMod->hInst == hLib) {
 			if (lpMod->Count == 1) {
@@ -201,80 +237,106 @@
  */
 FARPROC GetProcAddress(HANDLE hModule, char *proc_name)
 {
-	WORD 	wOrdin;
-	int		sel, addr, ret;
+    int		i, sel, addr, ret;
     register struct w_files *w = wine_files;
-	int 	ordinal, len;
-	char 	* cpnt;
-	char	C[128];
-	HTASK	hTask;
-	LPTASKENTRY lpTask;
-	if (hModule >= 0xF000) {
-		if ((int) proc_name & 0xffff0000) {
-			printf("GetProcAddress: builtin %#04X, '%s'\n", 
-										hModule, proc_name);
-/*			wOrdin = FindOrdinalFromName(struct dll_table_entry_s *dll_table, proc_name); */
-			}
-		else {
-			printf("GetProcAddress: builtin %#04X, %d\n", 
-								hModule, (int)proc_name);
-			}
-		return NULL;
-		}
-	if (hModule == 0) {
-		hTask = GetCurrentTask();
-		printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask);
-		lpTask = (LPTASKENTRY) GlobalLock(hTask);
-		if (lpTask == NULL) {
-			printf("GetProcAddress: can't find current module handle !\n");
-			return NULL;
-			}
-		hModule = lpTask->hInst;
-		printf("GetProcAddress: current module=%04X instance=%04X!\n", 
-			lpTask->hModule, lpTask->hInst);
-		GlobalUnlock(hTask);
-		}
-	while (w && w->hinstance != hModule) w = w->next;
-	if (w == NULL) return NULL;
-	printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename);
-	if ((int)proc_name & 0xFFFF0000) {
-		AnsiUpper(proc_name);
-		printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name);
-		cpnt = w->nrname_table;
-		while(TRUE) {
-			if (((int) cpnt)  - ((int)w->nrname_table) >  
-			   w->ne_header->nrname_tab_length)  return NULL;
-			len = *cpnt++;
-			strncpy(C, cpnt, len);
-			C[len] = '\0';
+    int 	ordinal, len;
+    char 	* cpnt;
+    char	C[128];
+    HTASK	hTask;
+    LPTASKENTRY lpTask;
+
+    /* built-in dll ? */
+    if (IS_BUILTIN_DLL(hModule))
+    {
+	if ((int) proc_name & 0xffff0000) 
+	{
+	    printf("GetProcAddress: builtin %#04X, '%s'\n", 
+		   hModule, proc_name);
+	    if (GetEntryDLLName(dll_builtin_table[hModule - 0xFF00].dll_name,
+				proc_name, &sel, &addr)) 
+	    {
+		printf("Address not found !\n");
+	    }
+	}
+	else 
+	{
+	    printf("GetProcAddress: builtin %#04X, %d\n", 
+		   hModule, (int)proc_name);
+	    if (GetEntryDLLOrdinal(dll_builtin_table[hModule-0xFF00].dll_name,
+				   (int)proc_name & 0x0000FFFF, &sel, &addr)) 
+	    {
+		printf("Address not found !\n");
+	    }
+	}
+	ret = MAKELONG(addr, sel);
+	printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", 
+	       ret, sel, addr);
+	return (FARPROC)ret;
+    }
+    if (hModule == 0) 
+    {
+	hTask = GetCurrentTask();
+	printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask);
+	lpTask = (LPTASKENTRY) GlobalLock(hTask);
+	if (lpTask == NULL) 
+	{
+	    printf("GetProcAddress: can't find current module handle !\n");
+	    return NULL;
+	}
+	hModule = lpTask->hInst;
+	printf("GetProcAddress: current module=%04X instance=%04X!\n", 
+	       lpTask->hModule, lpTask->hInst);
+	GlobalUnlock(hTask);
+    }
+    while (w && w->hinstance != hModule) 
+	w = w->next;
+    if (w == NULL) 
+	return NULL;
+    printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename);
+    if ((int)proc_name & 0xFFFF0000) 
+    {
+	AnsiUpper(proc_name);
+	printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name);
+	cpnt = w->nrname_table;
+	while(TRUE) 
+	{
+	    if (((int) cpnt)  - ((int)w->nrname_table) >  
+		w->ne_header->nrname_tab_length)  return NULL;
+	    len = *cpnt++;
+	    strncpy(C, cpnt, len);
+	    C[len] = '\0';
 #ifdef DEBUG_MODULE
-			printf("pointing Function '%s' ordinal=%d !\n", 
-				C, *((unsigned short *)(cpnt +  len)));
+	    printf("pointing Function '%s' ordinal=%d !\n", 
+		   C, *((unsigned short *)(cpnt +  len)));
 #endif
-			if (strncmp(cpnt, proc_name, len) ==  0) {
-				ordinal =  *((unsigned short *)(cpnt +  len));
-				break;
-				}
-			cpnt += len + 2;
-			};
-		if (ordinal == 0) {
-			printf("GetProcAddress // function '%s' not found !\n", proc_name);
-			return NULL;
-			}
-		}
-	else {
-		printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name);
-		ordinal = (int)proc_name;
-		}
-	ret = GetEntryPointFromOrdinal(w, ordinal);
-	if (ret == -1) {
-		printf("GetProcAddress // Function #%d not found !\n", ordinal);
-		return NULL;
-		}
-	addr  = ret & 0xffff;
-	sel = (ret >> 16);
-	printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr);
-	return (FARPROC) ret;
+	    if (strncmp(cpnt, proc_name, len) ==  0) 
+	    {
+		ordinal =  *((unsigned short *)(cpnt +  len));
+		break;
+	    }
+	    cpnt += len + 2;
+	};
+	if (ordinal == 0) 
+	{
+	    printf("GetProcAddress // function '%s' not found !\n", proc_name);
+	    return NULL;
+	}
+    }
+    else 
+    {
+	printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name);
+	ordinal = (int)proc_name;
+    }
+    ret = GetEntryPointFromOrdinal(w, ordinal);
+    if (ret == -1) 
+    {
+	printf("GetProcAddress // Function #%d not found !\n", ordinal);
+	return NULL;
+    }
+    addr  = ret & 0xffff;
+    sel = (ret >> 16);
+    printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr);
+    return (FARPROC) ret;
 }
 
 #endif /* ifndef WINELIB */
diff --git a/loader/resource.c b/loader/resource.c
index a5fb3c8..a4f9c1f 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -248,6 +248,43 @@
     return read (fd, typeinfo, sizeof (*typeinfo)) == sizeof (*typeinfo);
 }
 #endif
+
+int
+type_match(int type_id1, int type_id2, int fd, off_t off)
+{
+	off_t old_pos;
+	unsigned char c;
+	size_t nbytes;
+	char name[256];
+
+	if (type_id1 == -1)
+		return 1;
+	if ((type_id1 & 0xffff0000) == 0) {
+		if ((type_id2 & 0x8000) == 0)
+			return 0;
+		return (type_id1 & 0x000f) == (type_id2 & 0x000f);
+	}
+	if ((type_id2 & 0x8000) != 0)
+		return 0;
+#ifdef DEBUG_RESOURCE
+	printf("type_compare: type_id2=%04X !\n", type_id2);
+#endif
+	old_pos = lseek(fd, 0, SEEK_CUR);
+	lseek(fd, off + type_id2, SEEK_SET);
+	read(fd, &c, 1);
+	nbytes = CONV_CHAR_TO_LONG (c);
+#ifdef DEBUG_RESOURCE
+	printf("type_compare: namesize=%d\n", nbytes);
+#endif
+	read(fd, name, nbytes);
+	lseek(fd, old_pos, SEEK_SET);
+	name[nbytes] = '\0';
+#ifdef DEBUG_RESOURCE
+	printf("type_compare: name=`%s'\n", name);
+#endif
+	return strcasecmp((char *) type_id1, name) == 0;
+}
+
 /**********************************************************************
  *					FindResourceByNumber
  */
@@ -281,8 +318,7 @@
     /*
      * Find resource.
      */
-    typeinfo.type_id = 0xffff;
-    while (typeinfo.type_id != 0) {
+    for (;;) {
 	if (!load_typeinfo (ResourceFd, &typeinfo)){
 	    printf("FindResourceByNumber (%X) bad typeinfo size !\n", resource_id);
 	    return -1;
@@ -292,7 +328,8 @@
 			typeinfo.type_id, typeinfo.count, type_id);
 #endif
 	if (typeinfo.type_id == 0) break;
-	if (typeinfo.type_id == type_id || type_id == -1) {
+	if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff)) {
+
 	    for (i = 0; i < typeinfo.count; i++) {
 #ifndef WINELIB
 		if (read(ResourceFd, &nameinfo, sizeof(nameinfo)) != 
@@ -306,7 +343,7 @@
 		    }
 #ifdef DEBUG_RESOURCE
 		printf("FindResource: search type=%X id=%X // type=%X id=%X\n",
-			type_id, resource_id, typeinfo.type_id, nameinfo.id);
+			type_id, resource_id, typeinfo.type_id, type_id2);
 #endif
 		if (nameinfo.id == resource_id) {
 		    memcpy(result_p, &nameinfo, sizeof(nameinfo));
@@ -377,8 +414,7 @@
     /*
      * Find resource.
      */
-    typeinfo.type_id = 0xffff;
-    while (typeinfo.type_id != 0)
+    for (;;)
     {
 	if (!load_typeinfo (ResourceFd, &typeinfo))
 	{
@@ -390,7 +426,7 @@
 			typeinfo.type_id, typeinfo.count, type_id);
 #endif
 	if (typeinfo.type_id == 0) break;
-	if (typeinfo.type_id == type_id || type_id == -1)
+	if (type_match(type_id, typeinfo.type_id, ResourceFd, rtoff))
 	{
 	    for (i = 0; i < typeinfo.count; i++)
 	    {
@@ -529,6 +565,16 @@
     rgbq[1].rgbGreen 	= 0x00;
     rgbq[1].rgbRed 	= 0x00;
     rgbq[1].rgbReserved = 0x00;
+    if (bih->biSizeImage == 0) {
+	if (bih->biCompression != BI_RGB) {
+	    printf("Unknown size for compressed Icon bitmap.\n");
+	    GlobalFree(rsc_mem);
+	    ReleaseDC(GetDesktopWindow(), hdc); 
+	    return 0;
+	    }
+	bih->biSizeImage = (bih->biWidth * bih->biHeight * bih->biBitCount
+			    + 7) / 8;
+	}
     lpico->hBitMask = CreateDIBitmap(hdc, bih, CBM_INIT,
     	(LPSTR)lp + bih->biSizeImage - sizeof(BITMAPINFOHEADER) / 2 - 4,
 	(BITMAPINFO *)bih, DIB_RGB_COLORS );
@@ -667,6 +713,7 @@
 {
     RESOURCE *r;
     HANDLE rh;
+    int type;
 
     if (instance == 0)
 	return 0;
@@ -688,15 +735,39 @@
     r->info_mem = rh;
     r->rsc_mem = 0;
 
-    if (((int) resource_name & 0xffff0000) == 0)
+    if (((int) type_name & 0xffff0000) == 0)
     {
-	r->size_shift = FindResourceByNumber(&r->nameinfo, (int)type_name,
-					     (int) resource_name | 0x8000);
+	type = (int) type_name;
+    }
+    else if (type_name[0] == '\0')
+    {
+	type = -1;
+    }
+    else if (type_name[0] == '#')
+    {
+	type = atoi(type_name + 1);
     }
     else
     {
-	r->size_shift = FindResourceByName(&r->nameinfo, (int)type_name, 
-					   resource_name);
+	type = (int) type_name;
+    }
+    if (((int) resource_name & 0xffff0000) == 0)
+    {
+	r->size_shift = FindResourceByNumber(&r->nameinfo, type,
+					     (int) resource_name | 0x8000);
+    }
+    else if (resource_name[0] == '\0')
+    {
+	r->size_shift = FindResourceByNumber(&r->nameinfo, type, -1);
+    }
+    else if (resource_name[0] == '#')
+    {
+	r->size_shift = FindResourceByNumber(&r->nameinfo, type,
+					     atoi(resource_name + 1));
+    }
+    else
+    {
+	r->size_shift = FindResourceByName(&r->nameinfo, type, resource_name);
     }
     
     if (r->size_shift == -1)
@@ -906,7 +977,7 @@
     GlobalFree(hmem);
 
 #ifdef DEBUG_RESOURCE
-    printf("            '%s'\n", buffer);
+    printf("LoadString // '%s' copied !\n", buffer);
 #endif
     return i;
 }
diff --git a/loader/selector.c b/loader/selector.c
index 834e252..fea7a6f 100644
--- a/loader/selector.c
+++ b/loader/selector.c
@@ -417,7 +417,7 @@
     if (s->shm_key == 0)
     {
 	munmap(s->base_addr, ((s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
-	memcpy(s, 0, sizeof(*s));
+	memset(s, 0, sizeof(*s));
 	SelectorMap[sel_idx] = 0;
     }
     else
@@ -432,7 +432,7 @@
 	if (alias_count == 1)
 	    shmctl(s->shm_key, IPC_RMID, NULL);
 	    
-	memcpy(s, 0, sizeof(*s));
+	memset(s, 0, sizeof(*s));
 	SelectorMap[sel_idx] = 0;
     }
     
@@ -457,7 +457,7 @@
     {
 	s = &Segments[sel_idx];
 	munmap(s->base_addr, ((s->length + PAGE_SIZE) & ~(PAGE_SIZE - 1)));
-	memcpy(s, 0, sizeof(*s));
+	memset(s, 0, sizeof(*s));
 	SelectorMap[sel >> 3] = 0;
     }
 #endif /* HAVE_IPC */
@@ -847,15 +847,10 @@
 	 * First we need to check for local heap.  Second we nee to see if
 	 * this is also the stack segment.
 	 */
-	if (i + 1 == ne_header->auto_data_seg)
+	if (i + 1 == ne_header->auto_data_seg || i + 1 == ne_header->ss)
 	{
-	    s->length += ne_header->local_heap_length;
-
-	    if (i + 1 == ne_header->ss)
-	    {
-		s->length += ne_header->stack_length;
-		ne_header->sp = s->length;
-	    }
+	    s->length = 0x10000;
+	    ne_header->sp = s->length - 2;
 	}
 
 	/*
diff --git a/loader/signal.c b/loader/signal.c
index 92aecd5..7de7064 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -131,6 +131,11 @@
 		if (!do_int26(scp)) 
 		    goto oops;
 		break;
+
+	      case 0x2f:
+		if (!do_int2f(scp)) 
+		    goto oops;
+		break;
 		
 	      default:
 		fprintf(stderr,"Unexpected Windows interrupt %x\n", *instr);
diff --git a/memory/global.c b/memory/global.c
index c257027..0a21566 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -790,5 +790,6 @@
 	if (free_map[i] == 1)
 	    total_free++;
     
+    printf("GetFreeSpace // return %ld !\n", total_free << 16);
     return total_free << 16;
 }
diff --git a/misc/cursor.c b/misc/cursor.c
index 49ce26c..15bc145 100644
--- a/misc/cursor.c
+++ b/misc/cursor.c
@@ -171,7 +171,7 @@
 	ReleaseDC(GetDesktopWindow(), hdc); 
 	return 0;
  	}
-	(char *)lp += 2;
+	lp++;
     for (j = 0; j < 16; j++)
     	printf("%04X ", *(lp + j));
 /*
diff --git a/misc/dos_fs.c b/misc/dos_fs.c
index 6d34222..77b2429 100644
--- a/misc/dos_fs.c
+++ b/misc/dos_fs.c
@@ -273,7 +273,7 @@
 			*s++ = toupper(*p);
 		else {
 			*s++ = '\\';
-			if (*s == '/' || *s == '\\') 
+			if (*(p+1) == '/' || *(p+1) == '\\') 
 			    p++;
 		}
 	}
@@ -390,6 +390,26 @@
 	return(temp);
 }
 
+char *GetDosFileName(char *unixfilename)
+{ 
+	int i;
+	char temp[256];
+	/*   /dos/windows/system.ini => c:\windows\system.ini */
+	
+	for (i = 0 ; i != MAX_DOS_DRIVES; i++) {
+		if (DosDrives[i].rootdir != NULL) {
+		   if (strncmp(DosDrives[i].rootdir, unixfilename, strlen(DosDrives[i].rootdir)) == 0) {
+			sprintf(temp, "%c:\\%s", 'A' + i, unixfilename + strlen(DosDrives[i].rootdir) + 1);
+			ToDos(temp);
+			return temp;
+		   }	
+		}
+	}
+	strcpy(temp, unixfilename);
+	ToDos(temp);
+	return(temp);
+}
+
 char *DOS_GetCurrentDir(int drive)
 { 
 	/* should return 'WINDOWS\SYSTEM' */
@@ -734,11 +754,7 @@
 	
 	do {
 		if ((d = readdir(de->ds)) == NULL) 
-		{
-			closedir(de->ds);
-			de->inuse = 0;
-			return de;
-		}
+			return NULL;
 
 		strcpy(de->filename, d->d_name);
 		if (d->d_reclen > 12)
@@ -765,7 +781,7 @@
 
 void DOS_closedir(struct dosdirent *de)
 {
-	if (de->inuse)
+	if (de && de->inuse)
 	{
 		closedir(de->ds);
 		de->inuse = 0;
diff --git a/misc/lstr.c b/misc/lstr.c
index eeaf7c2..361ea10 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -58,19 +58,25 @@
   return strlen(str);
 }
 
+
 /* AnsiUpper USER.431 */
 char FAR* AnsiUpper(char FAR* strOrChar)
 {
   /* I am not sure if the locale stuff works with toupper, but then again 
      I am not sure if the Linux libc locale stuffs works at all */
-  if((int)strOrChar<256)
+/*  if((int)strOrChar<256)
     return (char FAR*) toupper((int)strOrChar);
-  else {
+  else { 
     int i;
-    for(i=0;(i<65536)&&strOrChar[i];i++)
-      strOrChar[i]=toupper(strOrChar[i]);
+    for(i=0;(i<65536) && strOrChar[i];i++) 
+      strOrChar[i]=toupper(strOrChar[i]); 
     return strOrChar;	
-  }
+  } */
+    int i;
+	for (i = 0; (i < 65536 && strOrChar[i]);i++) 
+		strOrChar[i] = (strOrChar[i] >= 'a' && strOrChar[i] <= 'z') ?
+						strOrChar[i] - ('a' - 'A') : strOrChar[i];
+	return strOrChar;	
 }
 
 /* AnsiLower USER.432 */
@@ -78,14 +84,18 @@
 {
   /* I am not sure if the locale stuff works with tolower, but then again 
      I am not sure if the Linux libc locale stuffs works at all */
-  if((int)strOrChar<256)
+/*  if((int)strOrChar<256)
     return (char FAR*)tolower((int)strOrChar);
   else {
     int i;
     for(i=0;(i<65536)&&strOrChar[i];i++)
       strOrChar[i]=tolower(strOrChar[i]);
     return strOrChar;	
-  }
+   }*/
+    int i;
+	for (i = 0; (i < 65536 && strOrChar[i]);i++) 
+		strOrChar[i] = (strOrChar[i] >= 'A' && strOrChar[i] <= 'Z') ?
+						strOrChar[i] + ('a' - 'A') : strOrChar[i];
 }
 
 /* AnsiUpperBuff USER.437 */
diff --git a/misc/main.c b/misc/main.c
index d5784f3..245b5c9 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -20,8 +20,9 @@
 
 #define WINE_CLASS    "Wine"    /* Class name for resources */
 
+LPSTR	lpEnvList;
+
 Display * XT_display;  /* To be removed */
-Screen * XT_screen;    /* To be removed */
 
 Display *display;
 Screen *screen;
@@ -298,7 +299,6 @@
     screenWidth  = WidthOfScreen( screen );
     screenHeight = HeightOfScreen( screen );
     XT_display   = display;
-    XT_screen    = screen;
     if (screenDepth)  /* -depth option specified */
     {
 	depth_list = XListDepths(display,DefaultScreen(display),&depth_count);
@@ -360,6 +360,26 @@
 }
 
 /***********************************************************************
+ *	SetEnvironment (GDI.132)
+ */
+int SetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nCount)
+{
+	printf("EMPTY STUB ! // SetEnvironnement('%s', '%s', %d) !\n",
+								lpPortName, lpEnviron, nCount);
+	return 0;
+}
+
+/***********************************************************************
+ *	GetEnvironment (GDI.134)
+ */
+int GetEnvironment(LPSTR lpPortName, LPSTR lpEnviron, WORD nMaxSiz)
+{
+	printf("EMPTY STUB ! // GetEnvironnement('%s', '%s', %d) !\n",
+								lpPortName, lpEnviron, nMaxSiz);
+	return 0;
+}
+
+/***********************************************************************
  *	GetTimerResolution (USER.14)
  */
 LONG GetTimerResolution(void)
diff --git a/misc/message.c b/misc/message.c
index 23e1be6..0a8da32 100644
--- a/misc/message.c
+++ b/misc/message.c
@@ -58,13 +58,15 @@
 	if (wndPtr == NULL) {
 		hInst = hSysRes;
 #ifdef DEBUG_MSGBOX
-		printf("MessageBox(NULL, '%s', '%s', %04X)\n", str, title, type);
+		printf("MessageBox(NULL, %08X='%s', %08X='%s', %04X)\n", 
+									str, str, title, title, type);
 #endif
 		}
 	else {
 		hInst = wndPtr->hInstance;
 #ifdef DEBUG_MSGBOX
-		printf("MessageBox(%04X, '%s', '%s', %04X)\n", hWnd, str, title, type);
+		printf("MessageBox(%04X, %08X='%s', %08X='%s', %04X)\n", 
+							hWnd, str, str, title, title, type);
 #endif
 		}
     lpmb = (LPMSGBOX) malloc(sizeof(MSGBOX));
@@ -379,7 +381,7 @@
 	strcpy(str, "WINELOGO");
 	hBitMap = LoadBitmap((HINSTANCE)NULL, (LPSTR)str);
 
-	strcpy(str, "PROPOSED_LICENSE");
+	strcpy(str, "LICENSE");
 	printf("str = '%s'\n", str);
 	hFile = OpenFile((LPSTR)str, &ofstruct, OF_READ);
 	ptr = (LPSTR)malloc(2048);
diff --git a/misc/mmsystem.c b/misc/mmsystem.c
index 9332079..e4c6a2e 100644
--- a/misc/mmsystem.c
+++ b/misc/mmsystem.c
@@ -13,6 +13,10 @@
 static WORD		mciActiveDev = 0;
 
 
+UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize);
+
+
 int MCI_LibMain(HANDLE hInstance, WORD wDataSeg,
 		 WORD cbHeapSize, LPSTR lpCmdLine)
 {
@@ -87,6 +91,7 @@
 {
 	LPSTR	msgptr;
 	int		maxbuf;
+	printf("mciGetErrorString(%04X, %08X, %d);\n", wError, lpstrBuffer, uLength);
 	if ((lpstrBuffer == NULL) || (uLength < 1)) return(FALSE);
 	lpstrBuffer[0] = '\0';
 	switch(wError) {
@@ -358,6 +363,7 @@
 */
 DWORD mciOpen(UINT wDevID, DWORD dwParam, LPMCI_OPEN_PARMS lpParms)
 {
+	char	str[128];
 	DWORD	dwDevTyp = 0;
 	if (lpParms == NULL) return MCIERR_INTERNAL;
 	printf("mciOpen(%04X, %08X, %08X)\n", wDevID, dwParam, lpParms);
@@ -368,19 +374,22 @@
 			dwDevTyp = (DWORD)lpParms->lpstrDeviceType;
 			}
 		else {
-			if (strcmp(lpParms->lpstrDeviceType, "cdaudio") == 0) {
+			printf("MCI_OPEN // Dev='%s' !\n", lpParms->lpstrDeviceType);
+			strcpy(str, lpParms->lpstrDeviceType);
+			AnsiUpper(str);
+			if (strcmp(str, "CDAUDIO") == 0) {
 				dwDevTyp = MCI_DEVTYPE_CD_AUDIO;
 				}
 			else
-			if (strcmp(lpParms->lpstrDeviceType, "waveaudio") == 0) {
+			if (strcmp(str, "WAVEAUDIO") == 0) {
 				dwDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
 				}
 			else
-			if (strcmp(lpParms->lpstrDeviceType, "Sequencer") == 0)	{
+			if (strcmp(str, "SEQUENCER") == 0)	{
 				dwDevTyp = MCI_DEVTYPE_SEQUENCER;
 				}
 			else
-			if (strcmp(lpParms->lpstrDeviceType, "Animation1") == 0) {
+			if (strcmp(str, "ANIMATION1") == 0) {
 				dwDevTyp = MCI_DEVTYPE_ANIMATION;
 				}
 			}
@@ -393,7 +402,8 @@
 				return MCIERR_DEVICE_NOT_INSTALLED;
 			case MCI_DEVTYPE_SEQUENCER:
 				printf("MCI_OPEN // No SEQUENCER yet !\n");
-				return MCIERR_DEVICE_NOT_INSTALLED;
+				break;
+/*				return MCIERR_DEVICE_NOT_INSTALLED; */
 			case MCI_DEVTYPE_ANIMATION:
 				printf("MCI_OPEN // No ANIMATION yet !\n");
 				return MCIERR_DEVICE_NOT_INSTALLED;
@@ -556,45 +566,6 @@
 
 
 
-HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags)
-{
-	printf("mmioOpen('%s', %08X, %08X);\n", szFileName, lpmmioinfo, dwOpenFlags);
-	return 0;
-}
-
-
-    
-UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags)
-{
-	printf("mmioClose(%04X, %04X);\n", hmmio, uFlags);
-	return 0;
-}
-
-
-
-LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch)
-{
-	printf("mmioRead\n");
-	return 0;
-}
-
-
-
-LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch)
-{
-	printf("mmioWrite\n");
-	return 0;
-}
-
-
-LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin)
-{
-	printf("mmioSeek\n");
-	return 0;
-}
-
-
-
 UINT WINAPI midiOutGetNumDevs(void)
 {
 	printf("midiOutGetNumDevs\n");
@@ -625,6 +596,9 @@
 }
 
 
+/**************************************************************************
+* 				midiOutGetErrorText 		[MMSYSTEM.203]
+*/
 UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
 	printf("midiOutGetErrorText\n");
@@ -632,6 +606,9 @@
 }
 
 
+/**************************************************************************
+* 				midiGetErrorText 		[internal]
+*/
 UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
 	LPSTR	msgptr;
@@ -781,6 +758,9 @@
 
 
 
+/**************************************************************************
+* 				midiInGetErrorText 		[MMSYSTEM.303]
+*/
 UINT WINAPI midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
 	printf("midiInGetErrorText\n");
@@ -851,35 +831,38 @@
 
 UINT WINAPI midiInStop(HMIDIIN hMidiIn)
 {
-printf("midiInStop\n");
-return 0;
+	printf("midiInStop\n");
+	return 0;
 }
 
 
 
 UINT WINAPI midiInReset(HMIDIIN hMidiIn)
 {
-printf("midiInReset\n");
-return 0;
+	printf("midiInReset\n");
+	return 0;
 }
 
 
 
 UINT WINAPI waveOutGetNumDevs()
 {
-printf("waveOutGetNumDevs\n");
-return 0;
+	printf("waveOutGetNumDevs\n");
+	return 0;
 }
 
 
 
 UINT WINAPI waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps, UINT uSize)
 {
-printf("waveOutGetDevCaps\n");
-return 0;
+	printf("waveOutGetDevCaps\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveOutGetErrorText 	[MMSYSTEM.403]
+*/
 UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
    printf("waveOutGetErrorText\n");
@@ -887,6 +870,9 @@
 }
 
 
+/**************************************************************************
+* 				waveGetErrorText 		[internal]
+*/
 UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
 	LPSTR	msgptr;
@@ -957,17 +943,17 @@
 UINT WINAPI waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID,
     const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
-printf("waveOutOpen\n");
-if (lphWaveOut != NULL) *lphWaveOut = 0;
-return 0;
+	printf("waveOutOpen\n");
+	if (lphWaveOut != NULL) *lphWaveOut = 0;
+	return MMSYSERR_BADDEVICEID;
 }
 
 
 
 UINT WINAPI waveOutClose(HWAVEOUT hWaveOut)
 {
-printf("waveOutClose\n");
-return 0;
+	printf("waveOutClose\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
@@ -975,8 +961,8 @@
 UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut,
      WAVEHDR FAR* lpWaveOutHdr, UINT uSize)
 {
-printf("waveOutPrepareHeader\n");
-return 0;
+	printf("waveOutPrepareHeader\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
@@ -984,99 +970,99 @@
 UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut,
     WAVEHDR FAR* lpWaveOutHdr, UINT uSize)
 {
-printf("waveOutUnprepareHeader\n");
-return 0;
+	printf("waveOutUnprepareHeader\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr,  UINT uSize)
 {
-printf("waveOutWrite\n");
-return 0;
+	printf("waveOutWrite\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 UINT WINAPI waveOutPause(HWAVEOUT hWaveOut)
 {
-printf("waveOutPause\n");
-return 0;
+	printf("waveOutPause\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut)
 {
-printf("waveOutRestart\n");
-return 0;
+	printf("waveOutRestart\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 UINT WINAPI waveOutReset(HWAVEOUT hWaveOut)
 {
-printf("waveOutReset\n");
-return 0;
+	printf("waveOutReset\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo, UINT uSize)
 {
-printf("waveOutGetPosition\n");
-return 0;
+	printf("waveOutGetPosition\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume)
 {
-printf("waveOutGetVolume\n");
-return 0;
+	printf("waveOutGetVolume\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 UINT WINAPI waveOutSetVolume(UINT uDeviceID, DWORD dwVolume)
 {
-printf("waveOutSetVolume\n");
-return 0;
+	printf("waveOutSetVolume\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID)
 {
-printf("waveOutGetID\n");
-return 0;
+	printf("waveOutGetID\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch)
 {
-printf("waveOutGetPitch\n");
-return 0;
+	printf("waveOutGetPitch\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch)
 {
-printf("waveOutSetPitch\n");
-return 0;
+	printf("waveOutSetPitch\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate)
 {
-printf("waveOutGetPlaybackRate\n");
-return 0;
+	printf("waveOutGetPlaybackRate\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate)
 {
-printf("waveOutSetPlaybackRate\n");
-return 0;
+	printf("waveOutSetPlaybackRate\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
@@ -1084,26 +1070,29 @@
 
 UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut)
 {
-printf("waveOutBreakLoop\n");
-return 0;
+	printf("waveOutBreakLoop\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
 UINT WINAPI waveInGetNumDevs()
 {
-printf("waveInGetNumDevs\n");
-return 0;
+/*	printf("waveInGetNumDevs\n"); */
+	return 0;
 }
 
 
 UINT WINAPI waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps, UINT uSize)
 {
-printf("waveInGetDevCaps\n");
-return 0;
+	printf("waveInGetDevCaps\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveInGetErrorText 	[MMSYSTEM.503]
+*/
 UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize)
 {
    printf("waveInGetErrorText\n");
@@ -1111,83 +1100,191 @@
 }
 
 
+/**************************************************************************
+* 				waveInOpen			[MMSYSTEM.504]
+*/
 UINT WINAPI waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID,
     const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
-printf("waveInOpen\n");
-if (lphWaveIn != NULL) *lphWaveIn = 0;
-return 0;
+	printf("waveInOpen\n");
+	if (lphWaveIn != NULL) *lphWaveIn = 0;
+	return MMSYSERR_BADDEVICEID;
 }
 
 
+/**************************************************************************
+* 				waveInClose			[MMSYSTEM.505]
+*/
 UINT WINAPI waveInClose(HWAVEIN hWaveIn)
 {
-printf("waveInClose\n");
-return 0;
+	printf("waveInClose\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveInPrepareHeader		[MMSYSTEM.506]
+*/
 UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn,
     WAVEHDR FAR* lpWaveInHdr, UINT uSize)
 {
-printf("waveInPrepareHeader\n");
-return 0;
+	printf("waveInPrepareHeader\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveInUnprepareHeader	[MMSYSTEM.507]
+*/
 UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn,
     WAVEHDR FAR* lpWaveInHdr, UINT uSize)
 {
-printf("waveInUnprepareHeader\n");
-return 0;
+	printf("waveInUnprepareHeader\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
 
+/**************************************************************************
+* 				waveInAddBuffer		[MMSYSTEM.508]
+*/
 UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn,
     WAVEHDR FAR* lpWaveInHdr, UINT uSize)
 {
-printf("waveInAddBuffer\n");
-return 0;
-}
-
-UINT WINAPI waveInReset(HWAVEIN hWaveIn)
-{
-printf("waveInReset\n");
-return 0;
+	printf("waveInAddBuffer\n");
+	return 0;
 }
 
 
+/**************************************************************************
+* 				waveInStart			[MMSYSTEM.509]
+*/
 UINT WINAPI waveInStart(HWAVEIN hWaveIn)
 {
-printf("waveInStart\n");
-return 0;
+	printf("waveInStart\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveInStop			[MMSYSTEM.510]
+*/
 UINT WINAPI waveInStop(HWAVEIN hWaveIn)
 {
-printf("waveInStop\n");
-return 0;
+	printf("waveInStop\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveInReset			[MMSYSTEM.511]
+*/
+UINT WINAPI waveInReset(HWAVEIN hWaveIn)
+{
+	printf("waveInReset\n");
+	return MMSYSERR_INVALHANDLE;
+}
 
+
+/**************************************************************************
+* 				waveInGetPosition	[MMSYSTEM.512]
+*/
 UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo, UINT uSize)
 {
-printf("waveInGetPosition\n");
-return 0;
+	printf("waveInGetPosition\n");
+	return MMSYSERR_INVALHANDLE;
 }
 
 
+/**************************************************************************
+* 				waveInGetID			[MMSYSTEM.513]
+*/
 UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID)
 {
-printf("waveInGetID\n");
-return 0;
+	printf("waveInGetID\n");
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mmioOpen			[MMSYSTEM.1210]
+*/
+HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags)
+{
+	printf("mmioOpen('%s', %08X, %08X);\n", szFileName, lpmmioinfo, dwOpenFlags);
+	return 0;
+}
+
+
+    
+/**************************************************************************
+* 				mmioClose			[MMSYSTEM.1211]
+*/
+UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags)
+{
+	printf("mmioClose(%04X, %04X);\n", hmmio, uFlags);
+	return 0;
+}
+
+
+
+/**************************************************************************
+* 				mmioRead			[MMSYSTEM.1212]
+*/
+LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch)
+{
+	printf("mmioRead\n");
+	return 0;
+}
+
+
+
+/**************************************************************************
+* 				mmioWrite			[MMSYSTEM.1213]
+*/
+LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch)
+{
+	printf("mmioWrite\n");
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mmioSeek			[MMSYSTEM.1214]
+*/
+LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin)
+{
+	printf("mmioSeek\n");
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mmioGetInfo			[MMSYSTEM.1215]
+*/
+UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags)
+{
+	printf("mmioGetInfo\n");
+	return 0;
+}
+
+
+/**************************************************************************
+* 				mmioGetInfo			[MMSYSTEM.1216]
+*/
+UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags)
+{
+	printf("mmioSetInfo\n");
+	return 0;
 }
 
 
 /*
+#1100   pascal  DRVOPEN
+#1101   pascal  DRVCLOSE
+#1102   pascal  DRVSENDMESSAGE
+#1103   pascal  DRVGETMODULEHANDLE
+#1104   pascal  DRVDEFDRIVERPROC
 UINT WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID,
     LPCSTR lpstrType);
 
@@ -1201,8 +1298,6 @@
 FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags);
 LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc,
     DWORD dwFlags);
-UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags);
-UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags);
 UINT WINAPI mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer,
     UINT uFlags);
 UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags);
diff --git a/misc/property.c b/misc/property.c
index 3ce34c8..18119c6 100644
--- a/misc/property.c
+++ b/misc/property.c
@@ -43,11 +43,15 @@
     	return FALSE;
     	}
 	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
-	if (lpProp == NULL) return 0;
+	if (lpProp == NULL) {
+		printf("Property List Empty !\n");
+		return 0;
+		}
 	while (TRUE) {
 		if ((((DWORD)lpStr & 0xFFFF0000) == 0L && 
 			lpProp->Atom == LOWORD((DWORD)lpStr)) ||
 			(((DWORD)lpStr & 0xFFFF0000) != 0L && 
+			lpProp->PropName != NULL &&
 			strcmp(lpProp->PropName, lpStr) == 0)) {
 		   	printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData);
 			hOldData = lpProp->hData;
@@ -90,11 +94,15 @@
     	return 0;
     	}
 	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
-	if (lpProp == NULL) return 0;
+	if (lpProp == NULL) {
+		printf("Property List Empty !\n");
+		return 0;
+		}
 	while (TRUE) {
 		if ((((DWORD)lpStr & 0xFFFF0000) == 0L && 
 			lpProp->Atom == LOWORD((DWORD)lpStr)) ||
 			(((DWORD)lpStr & 0xFFFF0000) != 0L && 
+			lpProp->PropName != NULL &&
 			strcmp(lpProp->PropName, lpStr) == 0)) {
 		   	printf("GetProp // Property found ! hData=%04X\n", lpProp->hData);
 			GlobalUnlock(wndPtr->hProp);
@@ -136,6 +144,7 @@
 			if ((((DWORD)lpStr & 0xFFFF0000) == 0L && 
 				lpProp->Atom == LOWORD((DWORD)lpStr)) ||
 				(((DWORD)lpStr & 0xFFFF0000) != 0L && 
+				lpProp->PropName != NULL &&
 				strcmp(lpProp->PropName, lpStr) == 0)) {
 #ifdef DEBUG_PROP
 			    printf("SetProp // change already exinsting property !\n");
@@ -177,7 +186,7 @@
 		}
 	else {
 		lpNewProp->Atom = 0;
-		lpNewProp->PropName = malloc(strlen(lpStr));
+		lpNewProp->PropName = malloc(strlen(lpStr) + 1);
 		if (lpNewProp->PropName == NULL) {
 	    	printf("SetProp // Can't allocate memory for Property Name !\n");
 			GlobalUnlock(wndPtr->hProp);
@@ -207,7 +216,10 @@
     	return 0;
     	}
 	lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp);
-	if (lpProp == NULL) return 0;
+	if (lpProp == NULL) {
+		printf("Property List Empty !\n");
+		return 0;
+		}
 	if (lpEnumFunc != NULL)	return 0;
 	while (TRUE) {
     	printf("EnumProps // lpProp->Atom=%04X !\n", lpProp->Atom);
diff --git a/miscemu/Imakefile b/miscemu/Imakefile
index c9c9db8..4b258c4 100644
--- a/miscemu/Imakefile
+++ b/miscemu/Imakefile
@@ -9,6 +9,7 @@
 	int21.c \
 	int25.c \
 	int26.c \
+	int2f.c \
 	ioports.c \
 	kernel.c
 
diff --git a/miscemu/emulate.c b/miscemu/emulate.c
index fd9cc05..1b69503 100644
--- a/miscemu/emulate.c
+++ b/miscemu/emulate.c
@@ -1,6 +1,3 @@
-static char RCSId[] = "$Id: heap.c,v 1.3 1993/07/04 04:04:21 root Exp root $";
-static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
-
 #include <stdlib.h>
 #include <stdio.h>
 #include "prototypes.h"
@@ -19,9 +16,9 @@
 WIN87_fpmath()
 {
   printf( "_fpmath: (%x:%x %x %x)\n",_CONTEXT->sc_cs, _CONTEXT->sc_eip, 
-	 _CONTEXT->sc_es, _BX);
+	 _CONTEXT->sc_es, _BX & 0xffff);
 
-  switch(_BX )
+  switch(_BX & 0xffff)
     {
     case 11:
       return 1;
diff --git a/miscemu/int21.c b/miscemu/int21.c
index d0f8003..cefe3ae 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -709,7 +709,6 @@
 
 	do {
 		if ((dp = DOS_readdir(dp)) == NULL) {
-			DOS_closedir(dp);
 			Error(NoMoreFiles, EC_MediaError , EL_Disk);
 			EAX = (EAX & 0xffffff00L) | NoMoreFiles;
 			SetCflag;
@@ -1026,7 +1025,6 @@
 		fprintf(stderr, "int21: delete file %s\n", temp);
 		/* unlink(GetUnixFileName(temp)); */
 	}
-
 	DOS_closedir(dp);
 	EAX = (EAX & 0xffffff00L);
 }
@@ -1072,7 +1070,6 @@
 		strcpy(newnameptr, fcb + 1);
 		fprintf(stderr, "int21: renamefile %s -> %s\n", oldname, newname);
 	}
-
 	DOS_closedir(dp);
 	EAX = (EAX & 0xffffff00L);
 }
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 6c21e0c..38fabec 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -61,7 +61,7 @@
     extern void _XInitImageFuncPtrs( XImage* );
     XImage * image;
 
-    image = XCreateImage( XT_display, DefaultVisualOfScreen(XT_screen),
+    image = XCreateImage( XT_display, DefaultVisualOfScreen(screen),
 			  bmp->bmBitsPixel, ZPixmap, 0, bmpData,
 			  bmp->bmWidth, bmp->bmHeight, 16, bmp->bmWidthBytes );
     if (!image) return 0;
diff --git a/objects/font.c b/objects/font.c
index 2ff21c5..6129981 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -13,6 +13,8 @@
 #include "user.h"
 #include "gdi.h"
 
+#define MAX_FONTS	256
+static LPLOGFONT lpLogFontList[MAX_FONTS] = { NULL };
 
 /***********************************************************************
  *           FONT_MatchFont
@@ -45,34 +47,35 @@
       case FF_DECORATIVE: family = "*"; break;
       default:            family = "*"; break;
     }
+    AnsiLower(family);
     
-    /* Width==0 seems not to be a valid wildcard on SGI's, using * instead */
-    if ( width == 0 )
-      sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-*-%s",
-	      family, weight, slant, height, spacing, charset
-	      );
-    else
-      sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-%d-%s",
-	      family, weight, slant, height, spacing, width, charset
-	      );
-
+	while (TRUE) {
+	    /* Width==0 seems not to be a valid wildcard on SGI's, using * instead */
+	    if ( width == 0 )
+	      sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-*-%s",
+		      family, weight, slant, height, spacing, charset);
+	    else
+	      sprintf( pattern, "-*-%s-%s-%c-normal--*-%d-*-*-%c-%d-%s",
+		      family, weight, slant, height, spacing, width, charset);
 #ifdef DEBUG_FONT
-    printf( "FONT_MatchFont: '%s'\n", pattern );
+	    printf( "FONT_MatchFont: '%s'\n", pattern );
 #endif
-    names = XListFonts( XT_display, pattern, 1, &count );
-    if (!count)
-    {
+	    names = XListFonts( XT_display, pattern, 1, &count );
+	    if (count > 0) break;
+		height -= 10;		
+		if (height < 10) {
 #ifdef DEBUG_FONT
-	printf( "        No matching font found\n" );	
+			printf( "        No matching font found\n" );	
 #endif
-	return NULL;
-    }
+			return NULL;
+		    }
+		}
 #ifdef DEBUG_FONT
-    printf( "        Found '%s'\n", *names );
+	printf( "        Found '%s'\n", *names );
 #endif
-    fontStruct = XLoadQueryFont( XT_display, *names );
-    XFreeFontNames( names );
-    return fontStruct;
+	fontStruct = XLoadQueryFont( XT_display, *names );
+	XFreeFontNames( names );
+	return fontStruct;
 }
 
 
@@ -134,6 +137,9 @@
     if (!hfont) return 0;
     fontPtr = (FONTOBJ *) GDI_HEAP_ADDR( hfont );
     memcpy( &fontPtr->logfont, font, sizeof(LOGFONT) );
+#ifdef DEBUG_FONT
+	printf("CreateFontIndirect(%08X); return %04X !\n", font, hfont);
+#endif
     return hfont;
 }
 
@@ -173,7 +179,9 @@
     X_PHYSFONT * stockPtr;
     HFONT prevHandle = dc->w.hFont;
     XFontStruct * fontStruct;
-
+#ifdef DEBUG_FONT
+	printf("FONT_SelectObject(%04X, %04X, %08X); !\n", dc, hfont, font);
+#endif
       /* Load font if necessary */
 
     if (!font)
@@ -422,6 +430,117 @@
     return TRUE;
 }
 
+/*************************************************************************
+ *				ParseFontParms		[internal]
+ */
+int ParseFontParms(LPSTR lpFont, WORD wParmsNo, LPSTR lpRetStr, WORD wMaxSiz)
+{
+	int 	i, j;
+#ifdef DEBUG_FONT
+	printf("ParseFontParms('%s', %d, %08X, %d);\n", 
+			lpFont, wParmsNo, lpRetStr, wMaxSiz);
+#endif
+	if (lpFont == NULL) return 0;
+	if (lpRetStr == NULL) return 0;
+	for (i = 0; (*lpFont != '\0' && i != wParmsNo); ) {
+		if (*lpFont == '-') i++;
+		lpFont++;
+		}
+	if (i == wParmsNo) {
+		if (*lpFont == '-') lpFont++;
+		wMaxSiz--;
+		for (i = 0; (*lpFont != '\0' && *lpFont != '-' && i < wMaxSiz); i++)
+			*(lpRetStr + i) = *lpFont++;
+		*(lpRetStr + i) = '\0';
+#ifdef DEBUG_FONT
+		printf("ParseFontParms // '%s'\n", lpRetStr);
+#endif
+		return i;
+		}
+	else
+		lpRetStr[0] = '\0';
+	return 0;
+}
+
+
+/*************************************************************************
+ *				InitFontsList		[internal]
+ */
+void InitFontsList()
+{
+    char 	str[32];
+    char 	pattern[100];
+    char 	*family, *weight, *charset;
+	char 	**names;
+    char 	slant, spacing;
+    int 	i, width, count;
+	LPLOGFONT	lpNewFont;
+    weight = "medium";
+    slant = 'r';
+    spacing = '*';
+    charset = "*";
+    family = "*";
+	printf("InitFontsList !\n");
+    sprintf( pattern, "-*-%s-%s-%c-normal--*-*-*-*-%c-*-%s",
+	      family, weight, slant, spacing, charset);
+    names = XListFonts( XT_display, pattern, MAX_FONTS, &count );
+#ifdef DEBUG_FONT
+	printf("InitFontsList // count=%d \n", count);
+#endif
+	for (i = 0; i < count; i++) {
+		lpNewFont = malloc(sizeof(LOGFONT) + LF_FACESIZE);
+		if (lpNewFont == NULL) {
+			printf("InitFontsList // Error alloc new font structure !\n");
+			break;
+			}
+#ifdef DEBUG_FONT
+		printf("InitFontsList // names[%d]='%s' \n", i, names[i]);
+#endif
+		ParseFontParms(names[i], 2, str, sizeof(str));
+		if (strcmp(str, "fixed") == 0) strcat(str, "sys");
+		AnsiUpper(str);
+		strcpy(lpNewFont->lfFaceName, str);
+		ParseFontParms(names[i], 7, str, sizeof(str));
+		lpNewFont->lfHeight = atoi(str) / 10;
+		ParseFontParms(names[i], 12, str, sizeof(str));
+		lpNewFont->lfWidth = atoi(str) / 10;
+		lpNewFont->lfEscapement = 0;
+		lpNewFont->lfOrientation = 0;
+		lpNewFont->lfWeight = FW_REGULAR;
+		lpNewFont->lfItalic = 0;
+		lpNewFont->lfUnderline = 0;
+		lpNewFont->lfStrikeOut = 0;
+		ParseFontParms(names[i], 13, str, sizeof(str));
+		if (strcmp(str, "iso8859") == 0)
+			lpNewFont->lfCharSet = ANSI_CHARSET;
+		else
+			lpNewFont->lfCharSet = OEM_CHARSET;
+		lpNewFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+		lpNewFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+		lpNewFont->lfQuality = DEFAULT_QUALITY;
+		ParseFontParms(names[i], 11, str, sizeof(str));
+		switch(str[0]) {
+			case 'p':
+				lpNewFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
+				break;
+			case 'm':
+				lpNewFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
+				break;
+			default:
+				lpNewFont->lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
+				break;
+			}
+#ifdef DEBUG_FONT
+		printf("InitFontsList // lpNewFont->lfHeight=%d \n", lpNewFont->lfHeight);
+		printf("InitFontsList // lpNewFont->lfWidth=%d \n", lpNewFont->lfWidth);
+		printf("InitFontsList // lfFaceName='%s' \n", lpNewFont->lfFaceName);
+#endif
+		lpLogFontList[i] = lpNewFont;
+		lpLogFontList[i+1] = NULL;
+		}
+    XFreeFontNames(names);
+}
+
 
 /*************************************************************************
  *				EnumFonts			[GDI.70]
@@ -430,11 +549,16 @@
 {
 	HANDLE			hLog;
 	HANDLE			hMet;
+	HFONT			hFont;
+	HFONT			hOldFont;
 	LPLOGFONT		lpLogFont;
 	LPTEXTMETRIC	lptm;
+	LPSTR			lpFaceList[MAX_FONTS];
+	char			FaceName[LF_FACESIZE];
 	int				nRet;
-	printf("EnumFonts(%04X, %08X, %08X, %08X)\n", 
-			hDC, lpFaceName, lpEnumFunc, lpData);
+	int				j, i = 0;
+	printf("EnumFonts(%04X, %08X='%s', %08X, %08X)\n", 
+		hDC, lpFaceName, lpFaceName, lpEnumFunc, lpData);
 	if (lpEnumFunc == NULL) return 0;
 	hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGFONT) + LF_FACESIZE);
 	lpLogFont = (LPLOGFONT) USER_HEAP_ADDR(hLog);
@@ -449,41 +573,49 @@
 		printf("EnumFonts // can't alloc TEXTMETRIC struct !\n");
 		return 0;
 		}
+	if (lpFaceName != NULL) {
+		strcpy(FaceName, lpFaceName);
+		AnsiUpper(FaceName);
+		}
+	if (lpLogFontList[0] == NULL) InitFontsList();
+	memset(lpFaceList, 0, MAX_FONTS * sizeof(LPSTR));
 	while (TRUE) {
-    	printf("EnumFonts // !\n");
-		lpLogFont->lfHeight = 18;
-		lpLogFont->lfWidth = 12;
-		lpLogFont->lfEscapement = 0;
-		lpLogFont->lfOrientation = 0;
-		lpLogFont->lfWeight = FW_REGULAR;
-		lpLogFont->lfItalic = 0;
-		lpLogFont->lfUnderline = 0;
-		lpLogFont->lfStrikeOut = 0;
-		lpLogFont->lfCharSet = ANSI_CHARSET;
-		lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
-		lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
-		lpLogFont->lfQuality = DEFAULT_QUALITY;
-		lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
-		strcpy(lpLogFont->lfFaceName, "Courier");
-		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+		if (lpLogFontList[i] == NULL) break;
+		if (lpFaceName == NULL) {
+			for (j = 0; j < MAX_FONTS; j++)	{
+				if (lpFaceList[j] == NULL) break;
+				if (strcmp(lpFaceList[j], lpLogFontList[i]->lfFaceName) == 0) {
+					i++; j = 0;
+					}
+				}
+			if (lpLogFontList[i] == NULL) break;
+			lpFaceList[j] = lpLogFontList[i]->lfFaceName;
+			printf("EnumFonts // enum all 'lpFaceName' '%s' !\n", lpFaceList[j]);
+			}
+		else {
+			while(lpLogFontList[i] != NULL) {
+				if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) == 0) break;
+				i++;
+				}
+			if (lpLogFontList[i] == NULL) break;
+			}
+		memcpy(lpLogFont, lpLogFontList[i++], sizeof(LOGFONT) + LF_FACESIZE);
+		hFont = CreateFontIndirect(lpLogFont);
+		hOldFont = SelectObject(hDC, hFont);
+		GetTextMetrics(hDC, lptm);
+		SelectObject(hDC, hOldFont);
+		DeleteObject(hFont);
+		printf("EnumFonts // i=%d lpLogFont=%08X lptm=%08X\n", i, lpLogFont, lptm);
 #ifdef WINELIB
 		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
 #else
 		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
 					2, (int)lptm, 0, (int)0, 2, (int)lpData);
 #endif
-		if (nRet == 0) break;
-		lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
-		strcpy(lpLogFont->lfFaceName, "Helvetica");
-		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
-#ifdef WINELIB
-		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
-#else
-		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
-					2, (int)lptm, 0, (int)0, 2, (int)lpData);
-#endif
-		if (nRet == 0) break;
-		else break;
+		if (nRet == 0) {
+			printf("EnumFonts // EnumEnd requested by application !\n");
+			break;
+			}
 		}
 	USER_HEAP_FREE(hMet);
 	USER_HEAP_FREE(hLog);
@@ -498,9 +630,14 @@
 {
 	HANDLE			hLog;
 	HANDLE			hMet;
+	HFONT			hFont;
+	HFONT			hOldFont;
 	LPLOGFONT		lpLogFont;
 	LPTEXTMETRIC	lptm;
+	LPSTR			lpFaceList[MAX_FONTS];
+	char			FaceName[LF_FACESIZE];
 	int				nRet;
+	int				j, i = 0;
 	printf("EnumFontFamilies(%04X, %08X, %08X, %08X)\n", 
 					hDC, lpszFamily, lpEnumFunc, lpData);
 	if (lpEnumFunc == NULL) return 0;
@@ -517,43 +654,49 @@
 		printf("EnumFontFamilies // can't alloc TEXTMETRIC struct !\n");
 		return 0;
 		}
+	if (lpszFamily != NULL) {
+		strcpy(FaceName, lpszFamily);
+		AnsiUpper(FaceName);
+		}
+	if (lpLogFontList[0] == NULL) InitFontsList();
+	memset(lpFaceList, 0, MAX_FONTS * sizeof(LPSTR));
 	while (TRUE) {
-    	printf("EnumFontFamilies // !\n");
-		lpLogFont->lfHeight = 12;
-		lpLogFont->lfWidth = 8;
-		lpLogFont->lfEscapement = 0;
-		lpLogFont->lfOrientation = 0;
-		lpLogFont->lfWeight = FW_REGULAR;
-		lpLogFont->lfItalic = 0;
-		lpLogFont->lfUnderline = 0;
-		lpLogFont->lfStrikeOut = 0;
-		lpLogFont->lfCharSet = ANSI_CHARSET;
-		lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
-		lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
-		lpLogFont->lfQuality = DEFAULT_QUALITY;
-		lpLogFont->lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
-		strcpy(lpLogFont->lfFaceName, "Courier");
-/*		lpLogFont->lfFullName[LF_FACESIZE] = 12;
-		lpLogFont->lfStyle[LF_FACESIZE] = 12; */
-		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
+		if (lpLogFontList[i] == NULL) break;
+		if (lpszFamily == NULL) {
+			for (j = 0; j < MAX_FONTS; j++)	{
+				if (lpFaceList[j] == NULL) break;
+				if (strcmp(lpFaceList[j], lpLogFontList[i]->lfFaceName) == 0) {
+					i++; j = 0;
+					}
+				}
+			if (lpLogFontList[i] == NULL) break;
+			lpFaceList[j] = lpLogFontList[i]->lfFaceName;
+			printf("EnumFontFamilies // enum all 'lpszFamily' '%s' !\n", lpFaceList[j]);
+			}
+		else {
+			while(lpLogFontList[i] != NULL) {
+				if (strcmp(FaceName, lpLogFontList[i]->lfFaceName) == 0) break;
+				i++;
+				}
+			if (lpLogFontList[i] == NULL) break;
+			}
+		memcpy(lpLogFont, lpLogFontList[i++], sizeof(LOGFONT) + LF_FACESIZE);
+		hFont = CreateFontIndirect(lpLogFont);
+		hOldFont = SelectObject(hDC, hFont);
+		GetTextMetrics(hDC, lptm);
+		SelectObject(hDC, hOldFont);
+		DeleteObject(hFont);
+		printf("EnumFontFamilies // i=%d lpLogFont=%08X lptm=%08X\n", i, lpLogFont, lptm);
 #ifdef WINELIB
 		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
 #else
 		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
 					2, (int)lptm, 0, (int)0, 2, (int)lpData);
 #endif
-		if (nRet == 0) break;
-		lpLogFont->lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS;
-		strcpy(lpLogFont->lfFaceName, "Helvetica");
-		printf("lpLogFont=%08X lptm=%08X\n", lpLogFont, lptm);
-#ifdef WINELIB
-		nRet = (*lpEnumFunc)(lpLogFont, lptm, 0, lpData);
-#else
-		nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLogFont,
-					2, (int)lptm, 0, (int)0, 2, (int)lpData);
-#endif
-		if (nRet == 0) break;
-		else break;
+		if (nRet == 0) {
+			printf("EnumFontFamilies // EnumEnd requested by application !\n");
+			break;
+			}
 		}
 	USER_HEAP_FREE(hMet);
 	USER_HEAP_FREE(hLog);
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 6243fd2..9248c32 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -8,11 +8,19 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include "user.h"
 #include "gdi.h"
 #include "prototypes.h"
 
 MDESC *GDI_Heap = NULL;
 
+/* Object types for EnumObjects() */
+#define OBJ_PEN             1
+#define OBJ_BRUSH           2
+
+#define MAX_OBJ 			1024
+HANDLE *lpPenBrushList = NULL;
+
 extern HPALETTE COLOR_Init();  /* color.c */
 
 /***********************************************************************
@@ -178,6 +186,36 @@
 
 
 /***********************************************************************
+ *           GDI_AppendToPenBrushList
+ */
+BOOL GDI_AppendToPenBrushList(HANDLE hNewObj)
+{
+	HANDLE	 	*lphObj;
+	int			i = 1;
+	if (hNewObj == 0) return FALSE;
+	if (lpPenBrushList == NULL) {
+		lpPenBrushList = malloc(MAX_OBJ * sizeof(HANDLE));
+		lpPenBrushList[0] = 0;
+#ifdef DEBUG_GDI
+		printf("GDI_AppendToPenBrushList() lpPenBrushList allocated !\n");
+#endif
+		}
+	for (lphObj = lpPenBrushList; i < MAX_OBJ; i++) {
+		if (*lphObj == 0) {
+			*lphObj = hNewObj;
+			*(lphObj + 1) = 0;
+#ifdef DEBUG_GDI
+			printf("GDI_AppendToPenBrushList(%04X) appended (count=%d)\n", hNewObj, i);
+#endif
+			return TRUE;
+			}
+		lphObj++;
+		}
+	return FALSE;
+}
+
+
+/***********************************************************************
  *           GDI_FindPrevObject
  *
  * Return the GDI object whose hNext field points to obj.
@@ -212,6 +250,9 @@
     obj->hNext   = 0;
     obj->wMagic  = magic;
     obj->dwCount = ++count;
+	if (magic == PEN_MAGIC || magic == BRUSH_MAGIC) {
+		GDI_AppendToPenBrushList(handle);
+		}
     return handle;
 }
 
@@ -389,3 +430,136 @@
 #endif
     return TRUE;
 }
+
+
+/***********************************************************************
+ *           EnumObjects    (GDI.71)
+ */
+int EnumObjects(HDC hDC, int nObjType, FARPROC lpEnumFunc, LPSTR lpData)
+{
+    HANDLE 		handle;
+    DC 			*dc;
+	HANDLE		*lphObj;
+	GDIOBJHDR 	*header;
+	WORD  		wMagic;
+	LPSTR		lpLog;  	/* Point to a LOGBRUSH or LOGPEN struct */
+	HANDLE 		hLog;
+	int			i, nRet;
+	if (lpEnumFunc == NULL) {
+		printf("EnumObjects // Bad EnumProc callback address !\n");
+		return 0;
+		}
+	switch (nObjType) {
+		case OBJ_PEN:
+			wMagic = PEN_MAGIC;
+			printf("EnumObjects(%04X, OBJ_PEN, %08X, %08X);\n", 
+									hDC, lpEnumFunc, lpData);
+			hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGPEN));
+			lpLog = (LPSTR) USER_HEAP_ADDR(hLog);
+			if (lpLog == NULL) {
+				printf("EnumObjects // Unable to alloc LOGPEN struct !\n");
+				return 0;
+				}
+			break;
+		case OBJ_BRUSH:
+			wMagic = BRUSH_MAGIC;
+			printf("EnumObjects(%04X, OBJ_BRUSH, %08X, %08X);\n", 
+									hDC, lpEnumFunc, lpData);
+			hLog = USER_HEAP_ALLOC(GMEM_MOVEABLE, sizeof(LOGBRUSH));
+			lpLog = (LPSTR) USER_HEAP_ADDR(hLog);
+			if (lpLog == NULL) {
+				printf("EnumObjects // Unable to alloc LOGBRUSH struct !\n");
+				return 0;
+				}
+			break;
+		default:
+			printf("EnumObjects(%04X, %04X, %08X, %08X); // Unknown OBJ type !\n", 
+						hDC, nObjType, lpEnumFunc, lpData);
+			return 0;
+		}
+	printf("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), (LPLOGPEN)lpLog);
+			BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), (LPLOGBRUSH)lpLog);
+			printf("EnumObjects // StockObj lpLog=%08X lpData=%08X\n", lpLog, lpData);
+			if (header->wMagic == BRUSH_MAGIC) {
+				printf("EnumObjects // StockBrush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle);
+				printf("EnumObjects // StockBrush lbColor=%08X\n", ((LPLOGBRUSH)lpLog)->lbColor);
+				printf("EnumObjects // StockBrush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch);
+				}
+			if (header->wMagic == PEN_MAGIC) {
+				printf("EnumObjects // StockPen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle);
+				printf("EnumObjects // StockPen lopnWidth=%08X\n", ((LPLOGPEN)lpLog)->lopnWidth);
+				printf("EnumObjects // StockPen lopnColor=%08X\n", ((LPLOGPEN)lpLog)->lopnColor);
+				}
+			nRet = 1;
+/*
+#ifdef WINELIB
+			nRet = (*lpEnumFunc)(lpLog, lpData);
+#else
+			nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLog,	2, (int)lpData);
+#endif
+*/
+			printf("EnumObjects // after CallBack16 !\n");
+			if (nRet == 0) {
+				USER_HEAP_FREE(hLog);
+				printf("EnumObjects // EnumEnd requested by application !\n");
+				return 0;
+				}
+			}
+		}
+	if (lpPenBrushList == NULL) return 0;
+	printf("EnumObjects // Now DC owned objects %08X !\n", header);
+	for (lphObj = lpPenBrushList; *lphObj != 0; ) {
+#ifdef DEBUG_GDI
+		printf("EnumObjects // *lphObj=%04X\n", *lphObj);
+#endif
+		header = (GDIOBJHDR *) GDI_HEAP_ADDR(*lphObj++);
+		if (header->wMagic == wMagic) {
+#ifdef DEBUG_GDI
+			printf("EnumObjects // DC_Obj lpLog=%08X lpData=%08X\n", lpLog, lpData);
+#endif
+			if (header->wMagic == BRUSH_MAGIC) {
+				BRUSH_GetObject( (BRUSHOBJ *)header, sizeof(LOGBRUSH), (LPLOGBRUSH)lpLog);
+				printf("EnumObjects // DC_Brush lbStyle=%04X\n", ((LPLOGBRUSH)lpLog)->lbStyle);
+				printf("EnumObjects // DC_Brush lbColor=%08X\n", ((LPLOGBRUSH)lpLog)->lbColor);
+				printf("EnumObjects // DC_Brush lbHatch=%04X\n", ((LPLOGBRUSH)lpLog)->lbHatch);
+				}
+			if (header->wMagic == PEN_MAGIC) {
+				PEN_GetObject( (PENOBJ *)header, sizeof(LOGPEN), (LPLOGPEN)lpLog);
+				printf("EnumObjects // DC_Pen lopnStyle=%04X\n", ((LPLOGPEN)lpLog)->lopnStyle);
+				printf("EnumObjects // DC_Pen lopnWidth=%08X\n", ((LPLOGPEN)lpLog)->lopnWidth);
+				printf("EnumObjects // DC_Pen lopnColor=%08X\n", ((LPLOGPEN)lpLog)->lopnColor);
+				}
+/*
+#ifdef WINELIB
+			nRet = (*lpEnumFunc)(lpLog, lpData);
+#else
+			nRet = CallBack16(lpEnumFunc, 4, 2, (int)lpLog,	2, (int)lpData);
+#endif
+*/
+			nRet = 1;
+			printf("EnumObjects // after CallBack16 !\n");
+			if (nRet == 0) {
+				USER_HEAP_FREE(hLog);
+				printf("EnumObjects // EnumEnd requested by application !\n");
+				return 0;
+				}
+			}
+		}
+	USER_HEAP_FREE(hLog);
+	printf("EnumObjects // End of enumeration !\n");
+	return 0;
+}
+
+/***********************************************************************
+ *           SetObjectOwner    (GDI.461)
+ */
+int SetObjectOwner(HANDLE hObj)
+{
+	printf("EMPTY STUB !!! SetObjectOwner() (I don't know its prototype !\n");
+	return 0;
+}
+
diff --git a/objects/text.c b/objects/text.c
index 0d9690b..e7d3cdb 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -418,7 +418,7 @@
 BOOL ExtTextOut(HDC hDC, short x, short y, WORD wOptions, LPRECT lprect,
 			LPSTR str, WORD count, LPINT lpDx)
 {
-	printf("EMPTY STUB !!! ExtTextOut(); ! (call TextOut() for new)\n");
+	printf("EMPTY STUB !!! ExtTextOut(); ! call TextOut() for now !\n");
 	TextOut(hDC, x, y, str, count);
 	return FALSE;
 }
diff --git a/windows/dialog.c b/windows/dialog.c
index 7724084..2e5b6e3 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -156,7 +156,7 @@
     LPCSTR data;
 
 #ifdef DEBUG_DIALOG
-    printf( "CreateDialogParam: %d,'%s',%d,%p,%d\n",
+    printf( "CreateDialogParam: %d,'%x',%d,%p,%d\n",
 	    hInst, dlgTemplate, owner, dlgProc, param );
 #endif
      
@@ -295,10 +295,10 @@
 	    }
 	header->style |= WS_CHILD;
 	CreateWindowEx( WS_EX_NOPARENTNOTIFY, 
-		        class, text, header->style,
-		        header->x * xUnit / 4, header->y * yUnit / 8,
-		        header->cx * xUnit / 4, header->cy * yUnit / 8,
-		        hwnd, header->id, hInst, NULL );
+		       class, text, header->style,
+		       header->x * xUnit / 4, header->y * yUnit / 8,
+		       header->cx * xUnit / 4, header->cy * yUnit / 8,
+		       hwnd, header->id, hInst, NULL );
 	header = next_header;
     }    
 
@@ -381,7 +381,7 @@
     HWND hwnd;
     
 #ifdef DEBUG_DIALOG
-    printf( "DialogBoxParam: %d,'%s',%d,%p,%d\n",
+    printf( "DialogBoxParam: %d,'%x',%d,%p,%d\n",
 	    hInst, dlgTemplate, owner, dlgProc, param );
 #endif
     hwnd = CreateDialogParam( hInst, dlgTemplate, owner, dlgProc, param );
@@ -451,6 +451,7 @@
 	int dlgCode = SendMessage( msg->hwnd, WM_GETDLGCODE, 0, 0 );
 	/* Process key message */
 	/* .... */
+	SendMessage( msg->hwnd, msg->message, msg->wParam, msg->lParam );
     }
     return TRUE;
 }
diff --git a/windows/graphics.c b/windows/graphics.c
index a80d5cf..4a1abe1 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -35,7 +35,7 @@
     }
 
     if (DC_SetupGCForPen( dc ))
-	XDrawLine(XT_display, dc->u.x.drawable, dc->u.x.gc, 
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, 
 		  dc->w.DCOrgX + XLPTODP( dc, dc->w.CursPosX ),
 		  dc->w.DCOrgY + YLPTODP( dc, dc->w.CursPosY ),
 		  dc->w.DCOrgX + XLPTODP( dc, x ),
@@ -145,7 +145,7 @@
     diff_angle  = end_angle - start_angle;
     if (diff_angle < 0.0) diff_angle += 2*PI;
 
-    XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
+    XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
 	      dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 	      right-left-1, bottom-top-1,
 	      (int)(start_angle * 180 * 64 / PI),
@@ -162,7 +162,7 @@
 	points[1].x = dc->w.DCOrgX + xcenter;
 	points[1].y = dc->w.DCOrgY + ycenter;
     }
-    XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
+    XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
 	        points, lines+1, CoordModeOrigin );
     return TRUE;
 }
@@ -222,11 +222,11 @@
     if ((left == right) || (top == bottom)) return FALSE;
     
     if (DC_SetupGCForBrush( dc ))
-	XFillArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
 		  dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 		  right-left-1, bottom-top-1, 0, 360*64 );
     if (DC_SetupGCForPen( dc ))
-	XDrawArc( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
 		  dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 		  right-left-1, bottom-top-1, 0, 360*64 );
     return TRUE;
@@ -253,11 +253,11 @@
     bottom = YLPTODP( dc, bottom );
     
     if (DC_SetupGCForBrush( dc ))
-	XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 		        right-left-1, bottom-top-1 );
     if (DC_SetupGCForPen( dc ))
-	XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawRectangle( display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 		        right-left-1, bottom-top-1 );
     return TRUE;
@@ -289,41 +289,41 @@
     x2 = XLPTODP(dc, right - ell_width);
     y2 = YLPTODP(dc, bottom - ell_height);
     if (DC_SetupGCForBrush(dc)) {
-	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y1,
 		        ell_width, ell_height, 90 * 64, 90 * 64);
-	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y2,
 		        ell_width, ell_height, 180 * 64, 90 * 64);
-	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y2,
 		        ell_width, ell_height, 270 * 64, 90 * 64);
-	XFillArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y1,
 		        ell_width, ell_height, 0, 90 * 64);
 	ell_width /= 2;  ell_height /= 2;
-	XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc,
 		dc->w.DCOrgX + left + ell_width, dc->w.DCOrgY + top,
 		right - left - 2 * ell_width, bottom - top);
-	XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc,
 		dc->w.DCOrgX + left, dc->w.DCOrgY + top + ell_height,
 		ell_width, bottom - top - 2 * ell_height);
-	XFillRectangle(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc,
 		dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top + ell_height,
 		ell_width, bottom - top - 2 * ell_height);
 	ell_width *= 2;  ell_height *= 2;
 	}    	
     if (DC_SetupGCForPen(dc)) {
-	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y1,
 		        ell_width, ell_height, 90 * 64, 90 * 64);
-	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x1, dc->w.DCOrgY + y2,
 		        ell_width, ell_height, 180 * 64, 90 * 64);
-	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y2,
 		        ell_width, ell_height, 270 * 64, 90 * 64);
-	XDrawArc(XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + x2, dc->w.DCOrgY + y1,
 		        ell_width, ell_height, 0, 90 * 64);
 	}
@@ -423,9 +423,9 @@
     pixel = COLOR_ToPhysical( dc, color );
     GetPaletteEntries( dc->w.hPalette, pixel, 1, &entry );
     
-    XSetForeground( XT_display, dc->u.x.gc, pixel );
-    XSetFunction( XT_display, dc->u.x.gc, GXcopy );
-    XDrawPoint( XT_display, dc->u.x.drawable, dc->u.x.gc, x, y );
+    XSetForeground( display, dc->u.x.gc, pixel );
+    XSetFunction( display, dc->u.x.gc, GXcopy );
+    XDrawPoint( display, dc->u.x.drawable, dc->u.x.gc, x, y );
 
     return RGB( entry.peRed, entry.peGreen, entry.peBlue );
 }
@@ -450,13 +450,13 @@
     {
 	XWindowAttributes win_attr;
 	
-	if (!XGetWindowAttributes( XT_display, dc->u.x.drawable, &win_attr ))
+	if (!XGetWindowAttributes( display, dc->u.x.drawable, &win_attr ))
 	    return 0;
 	if (win_attr.map_state != IsViewable) return 0;
 	if ((x >= win_attr.width) || (y >= win_attr.height)) return 0;
     }
     
-    image = XGetImage( XT_display, dc->u.x.drawable, x, y,
+    image = XGetImage( display, dc->u.x.drawable, x, y,
 		       1, 1, AllPlanes, ZPixmap );
     GetPaletteEntries( dc->w.hPalette, XGetPixel( image, 0, 0 ), 1, &entry );
     XDestroyImage( image );
@@ -494,7 +494,7 @@
 
     GetClipBox( hdc, &box );
     if (DC_SetupGCForBrush( dc ))
-	XFillRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + box.left, dc->w.DCOrgY + box.top,
 		        box.right-box.left, box.bottom-box.top );
 
@@ -541,7 +541,7 @@
     oldBkMode = SetBkMode(hdc, TRANSPARENT);
 
     if (DC_SetupGCForPen( dc ))
-	XDrawRectangle( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XDrawRectangle( display, dc->u.x.drawable, dc->u.x.gc,
 		        dc->w.DCOrgX + left, dc->w.DCOrgY + top,
 		        right-left-1, bottom-top-1 );
 
@@ -601,12 +601,12 @@
     if (DC_SetupGCForPen( dc ))
     {
 	for (i = 0; i < count-1; i ++)
-	    XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,  
+	    XDrawLine (display, dc->u.x.drawable, dc->u.x.gc,  
 		       dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
 		       dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
 		       dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
 		       dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
-	XDrawLine (XT_display, dc->u.x.drawable, dc->u.x.gc,  
+	XDrawLine (display, dc->u.x.drawable, dc->u.x.gc,  
 		   dc->w.DCOrgX + XLPTODP(dc, pt [count-1].x),
 		   dc->w.DCOrgY + YLPTODP(dc, pt [count-1].y),
 		   dc->w.DCOrgX + XLPTODP(dc, pt [0].x),
@@ -644,12 +644,12 @@
 	}
 	points [count] = points [0];
 		
-	XFillPolygon( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	XFillPolygon( display, dc->u.x.drawable, dc->u.x.gc,
 		     points, count, Complex, CoordModeOrigin);
 		
 	if (DC_SetupGCForPen ( dc ))
 	{
-	    XDrawLines( XT_display, dc->u.x.drawable, dc->u.x.gc,
+	    XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
 		       points, count, CoordModeOrigin );
 	}
     }
diff --git a/windows/nonclient.c b/windows/nonclient.c
index a717031..45ca0d8 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -16,6 +16,7 @@
 #include "syscolor.h"
 
 static HBITMAP hbitmapClose = 0;
+static HBITMAP hbitmapMDIClose = 0;
 static HBITMAP hbitmapMinimize = 0;
 static HBITMAP hbitmapMinimizeD = 0;
 static HBITMAP hbitmapMaximize = 0;
@@ -287,11 +288,15 @@
 static void NC_DrawSysButton( HWND hwnd, HDC hdc, BOOL down )
 {
     RECT rect;
+    WND *wndPtr = WIN_FindWndPtr( hwnd );
     HDC hdcMem = CreateCompatibleDC( hdc );
     if (hdcMem)
     {
 	NC_GetInsideRect( hwnd, &rect );
-	SelectObject( hdcMem, hbitmapClose );
+	if (wndPtr->dwStyle & WS_CHILD)
+		SelectObject( hdcMem, hbitmapMDIClose );
+	else
+		SelectObject( hdcMem, hbitmapClose );
 	BitBlt( hdc, rect.left, rect.top, SYSMETRICS_CXSIZE,
 	       SYSMETRICS_CYSIZE, hdcMem, 1, 1, down ? NOTSRCCOPY : SRCCOPY );
 	DeleteDC( hdcMem );
@@ -457,6 +462,8 @@
     {
 	if (!(hbitmapClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
 	    return;
+	if (!(hbitmapMDIClose = LoadBitmap( 0, MAKEINTRESOURCE(OBM_OLD_CLOSE) )))
+	    return;
 	hbitmapMinimize  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCE) );
 	hbitmapMinimizeD = LoadBitmap( 0, MAKEINTRESOURCE(OBM_REDUCED) );
 	hbitmapMaximize  = LoadBitmap( 0, MAKEINTRESOURCE(OBM_ZOOM) );
diff --git a/windows/utility.c b/windows/utility.c
index c16616d..a1e0d0e 100644
--- a/windows/utility.c
+++ b/windows/utility.c
@@ -285,113 +285,72 @@
 #ifndef WINELIB
 INT windows_wsprintf(BYTE *win_stack)
 {
-	LPSTR lpOutput, lpFormat;
-	BYTE *new_stack, *stack_ptr, *ptr;
-	int stacklength, result;
+	LPSTR lpOutput, lpFormat, ptr;
+	BYTE new_stack[1024], *stack_ptr;
 
 	lpOutput = (LPSTR) *(DWORD*)win_stack;
 	win_stack += 4;
 	lpFormat = (LPSTR) *(DWORD*)win_stack;
 	win_stack += 4;
 
-	/* determine # of bytes pushed on 16-bit stack by checking printf's
-	   format string */
-	
-	ptr = lpFormat;
-	stacklength = 0;
-	do {
-		if (*ptr++ != '%')
-			continue;
-
-		/* skip width/precision */
-		while (	*ptr == '-' || *ptr == '+' || *ptr == '.' ||
-			*ptr == ' ' || isdigit(*ptr))
-			ptr++;
-
-		switch(*ptr++) {
-			case 'l': ptr++; /* skip next type character */
-				stacklength += 4;
-				continue;
-			case 's':
-				stacklength += 4;
-				continue;
-			case 'c':
-			case 'd':
-			case 'i':
-			case 'u':
-			case 'x':
-			case 'X':
-				stacklength += 2;
-				continue;
-			default:
-				fprintf(stderr, "wsprintf: oops, unknown formattype `%c' used!\n", *ptr);
-		}
-	} while (*ptr);
-
 	/* create 32-bit stack for libc's vsprintf() */
 
-	new_stack = malloc(2 * stacklength); 
-	stack_ptr = new_stack + 2 * stacklength;
-	win_stack += stacklength;
-	ptr  = lpFormat;
-	do {
-		if (*ptr++ != '%')
+	for (ptr = lpFormat, stack_ptr = new_stack; *ptr; ptr++) {
+		if (*ptr != '%' || *++ptr == '%')
 			continue;
 
 		/* skip width/precision */
-		while (	*ptr == '-' || *ptr == '+' || *ptr == '.' ||
-			*ptr == ' ' || isdigit(*ptr))
+		while (*ptr == '-' || *ptr == '+' || *ptr == '.' ||
+		       *ptr == ' ' || isdigit(*ptr))
 			ptr++;
 			
-		switch(*ptr++) {
+		switch (*ptr++) {
 			case 's':
-				stack_ptr -= 4;
- 				win_stack -= 4;
 				*(DWORD*)stack_ptr = *(DWORD*)win_stack;
-				continue;
+				stack_ptr += 4;
+ 				win_stack += 4;
+				break;
 			case 'l':
-				stack_ptr -= 4;
-				win_stack -= 4;
 				*(DWORD*)stack_ptr = *(DWORD*)win_stack;
+				stack_ptr += 4;
+				win_stack += 4;
 				ptr++; /* skip next type character */
-				continue;
+				break;
 			case 'c':
-				stack_ptr -= 4;
-				win_stack -= 2;
 	
-/* windows' wsprintf() %c ignores 0's, we replace 0 with 1 to make sure
+/* windows' wsprintf() %c ignores 0's, we replace 0 with SPACE to make sure
    that the remaining part of the string isn't ignored by the winapp */
 				
 				if (*(WORD*)win_stack)
 					*(DWORD*)stack_ptr = *(WORD*)win_stack;
 				else
-					*(DWORD*)stack_ptr = 1;
-				continue;
+					*(DWORD*)stack_ptr = ' ';
+				stack_ptr += 4;
+				win_stack += 2;
+				break;
 			case 'd':
 			case 'i':
-				stack_ptr -= 4;
-				win_stack -= 2;
 				*(int*)stack_ptr = *(INT*)win_stack;
-				continue;
+				stack_ptr += 4;
+				win_stack += 2;
+				break;
 			case 'u':
 			case 'x':
 			case 'X':
-				stack_ptr -= 4;
-				win_stack -= 2;
 				*(DWORD*)stack_ptr = *(WORD*)win_stack;
-				continue;
+				stack_ptr += 4;
+				win_stack += 2;
+				break;
 			default:
-				stack_ptr -= 4;
-				win_stack -= 4;
 				*(DWORD*)stack_ptr = 0;
+				stack_ptr += 4;
+				win_stack += 4;
 				fprintf(stderr, "wsprintf: oops, unknown formattype %c used!\n", *ptr);
+				break;
 		}
-	} while (*ptr);
+	}
 
-	result = vsprintf(lpOutput, lpFormat, stack_ptr);
-	free(new_stack);
-
-	return result;
+	return vsprintf(lpOutput, lpFormat, new_stack);
 }
 #endif
 
diff --git a/windows/win.c b/windows/win.c
index 572dfe6..cbd72f2 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -444,6 +444,9 @@
     WIN_SendParentNotify( hwnd, WM_CREATE, MAKELONG( hwnd, wndPtr->wIDmenu ) );
     
     if (style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
+#ifdef DEBUG_WIN
+    printf( "CreateWindowEx: return %04X \n", hwnd);
+#endif
     return hwnd;
 }
 
diff --git a/windows/winpos.c b/windows/winpos.c
index f236d49..98cfa11 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -230,7 +230,7 @@
     int swpflags = 0;
 
 #ifdef DEBUG_WIN
-    printf("ShowWindow: hwnd=%d, cmd=%d\n", hwnd, cmd);
+    printf("ShowWindow: hwnd=%04X, cmd=%d\n", hwnd, cmd);
 #endif
     
     if (!wndPtr) return FALSE;
@@ -456,7 +456,7 @@
     int changeMask = 0;
 
 #ifdef DEBUG_WIN
-    printf( "SetWindowPos: %d %d %d,%d %dx%d 0x%x\n",
+    printf( "SetWindowPos: %04X %d %d,%d %dx%d 0x%x\n",
 	    hwnd, hwndInsertAfter, x, y, cx, cy, flags );
 #endif
 
@@ -592,10 +592,14 @@
 	}
 	changeMask |= CWStackMode;
     }
-    if (changeMask) XConfigureWindow( display, wndPtr->window,
-				      changeMask, &winChanges );
+	if ((newWindowRect.right - newWindowRect.left) != 0 &&
+		(newWindowRect.bottom - newWindowRect.top) != 0)
+		if (changeMask) XConfigureWindow( display, wndPtr->window,
+									changeMask, &winChanges );
 
-    if (winPos->flags & SWP_SHOWWINDOW)
+	if ((newWindowRect.right - newWindowRect.left) != 0 &&
+		(newWindowRect.bottom - newWindowRect.top) != 0 &&
+		(winPos->flags & SWP_SHOWWINDOW))
     {
 	wndPtr->dwStyle |= WS_VISIBLE;
 	XMapWindow( display, wndPtr->window );
