diff --git a/BUGS b/BUGS
index f006749..b05477e 100644
--- a/BUGS
+++ b/BUGS
@@ -4,3 +4,5 @@
 - MDI does not send WM_GETMINMAX message.
 - InitializeLoadedDLLs() can't init LZEXPAND.DLL. (cs:ip => 0:0)
 - LoadCursor does not correctly handle bitmap cursors
+- AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times.
+- Dialogs don't support resources which are referred to as integers.
diff --git a/ChangeLog b/ChangeLog
index adcba41..96b0bbb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,98 @@
 ----------------------------------------------------------------------
+Thu Jul 14 17:50:45 1994  Bob Amstadt  (bob@pooh)
+
+	* [Configure]
+	Autodetects Linux version (if running Linux).
+
+	* [loader/signal.c]
+	New signals for Linux.
+
+	* [loader/ldtlib.c]
+	New structure field in sys call.
+
+Sun Jul 10 19:31:34 1994  Olaf Flebbe  (olaf@dragon)
+
+        * [load/resource.c] 
+          fixed Memory (Resource) Leak.
+
+        * [load/main.c] 
+          fixed a printf.
+
+Tue Jul 12 18:50:34 1994  Alexandre Julliard  (julliard@lamisun.epfl.ch)
+
+	* [controls/desktop.c]
+	Implemented desktop wallpaper (only 16 colors for now).
+
+	* [controls/menu.c] [windows/nonclient.c]
+	Preliminary work to allow multi-line menus.
+
+	* [misc/main.c]
+	No backing store on desktop window (not useful).
+
+	* [objects/text.c]
+	A few fixes to DrawText() to make underlines under mnemonic
+	letters to look better.
+
+	* [windows/graphics.c]
+	More fixes to GRAPH_DrawArc(), and some fixes to Polygon().
+	Implemented PolyPolygon() (partially working).
+
+	* [windows/winpos.c]
+	New function WINPOS_SendNCCalcSize().
+	Cleaned up SetWindowPos() and added preliminary support for
+	multi-line menus.
+
+Mon Jul 11 19:15:51 1994  Miguel de Icaza  (miguel@sphinx)
+
+	* [controls/edit.c]
+	Changes to work as a library.
+
+	* [if1632/callback.c] 
+	Ifdefed module.
+
+	* [if1632/relay.c]
+	Changes to allow linking with WineLib.
+
+	* [include/windows.h]
+	Added macro WINELIB_UNIMP
+
+	* [loader/library.c]
+	When compiling WineLib, GetProcAddress is not implemented yet.
+
+	* [loader/main.c]
+	Added empty InitDLL when using WineLib.
+
+	* [loader/ne_image.c]
+	Some parts of the loader are needed for WineLib, ifdefed correctly
+
+	* [misc/{audio.c,mcicda.c,mmaux.c,mmsystem.c]
+	Disable compilation of module when compiling WineLib.
+
+	* [toolkit/heap.c]
+	Fixed small bug.  When passed an invalid handle WineLib would
+	crash, now return NULL.
+
+	* [toolkit/winmain.c]
+	Call CreateNewTask in _WinMain.
+
+Sun Jul 10 09:08:02 1994  David Metcalfe <david@prism.demon.co.uk>
+
+	* [controls/edit.c] [controls/widget.c]
+	More changes to improve compatibility with Windows' edit
+	control.  Finished off tab stop support.
+
+Mon Jul 11 21:05:02 MET DST 1994  Erik Bos <erik@hacktic.nl>
+
+	* [if1632/relay.c]
+	# of ordinals in shell.dll changed to 103.
+
+	* [loader/signal.c]
+	sti, cli will now be ignored.
+
+	* [objects/brush.c]
+	Added stub for GetSysColorBrush().
+
+----------------------------------------------------------------------
 Sun, 3 Jul 1994 20:15:56 +0100 (BST)  David Metcalfe <david@prism.demon.co.uk>
 
 	* [controls/edit.c]
diff --git a/Configure b/Configure
index 15c7c31..1cb4d5c 100644
--- a/Configure
+++ b/Configure
@@ -47,11 +47,25 @@
     NEWBUILD=''
 fi
 
+if [ -f /usr/include/linux/ldt.h ]
+then
+	if grep -q seg_not_present /usr/include/linux/ldt.h
+	then
+		NEWLINUXLDT='#define NewLinuxLdt -DNEW_LDT_STRUCT'
+		ALLDEFINES="$ALLDEFINES -DNEW_LDT_STRUCT"
+	else
+		NEWLINUXLDT=''
+	fi
+else
+	NEWLINUXLDT=''
+fi
+
 echo '/* autoconf.h generated automatically.  Run Configure. */' > autoconf.h
 echo $WINELIB >> autoconf.h
 echo $SHORTNAMES >> autoconf.h
 echo $NEWBUILD >> autoconf.h
 echo $WINE_INI_GLOBAL >> autoconf.h
+echo $NEWLINUXLDT >> autoconf.h
 echo "#define AutoDefines  $ALLDEFINES" >> autoconf.h
 
 xmkmf -a
diff --git a/controls/desktop.c b/controls/desktop.c
index 183b2a2..e1f5d7f 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -6,10 +6,56 @@
 
 static char Copyright[] = "Copyright  Alexandre Julliard, 1994";
 
+#include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
 #include "win.h"
 #include "desktop.h"
+#include "prototypes.h"
+
+
+/***********************************************************************
+ *           DESKTOP_LoadBitmap
+ *
+ * Load a bitmap from a file. Used by SetDeskWallPaper().
+ */
+static HBITMAP DESKTOP_LoadBitmap( HDC hdc, char *filename )
+{
+    BITMAPFILEHEADER *fileHeader;
+    BITMAPINFO *bitmapInfo;
+    HBITMAP hbitmap;
+    char *unixFileName, *buffer;
+    int file;
+    long size;
+
+      /* Read all the file into memory */
+
+    if (!(unixFileName = GetUnixFileName( filename ))) return 0;
+    if ((file = open( unixFileName, O_RDONLY )) == -1) return 0;
+    size = lseek( file, 0, SEEK_END );
+    if (!(buffer = (char *)malloc( size )))
+    {
+	close( file );
+	return 0;
+    }
+    lseek( file, 0, SEEK_SET );
+    size = read( file, buffer, size );
+    close( file );
+    fileHeader = (BITMAPFILEHEADER *)buffer;
+    bitmapInfo = (BITMAPINFO *)(buffer + sizeof(BITMAPFILEHEADER));
+    
+      /* Check header content */
+    if ((fileHeader->bfType != 0x4d42) || (size < fileHeader->bfSize))
+    {
+	free( buffer );
+	return 0;
+    }
+    hbitmap = CreateDIBitmap( hdc, &bitmapInfo->bmiHeader, CBM_INIT,
+			      buffer + fileHeader->bfOffBits,
+			      bitmapInfo, DIB_RGB_COLORS );
+    free( buffer );
+    return hbitmap;
+}
 
 
 /***********************************************************************
@@ -20,12 +66,49 @@
 static LONG DESKTOP_DoEraseBkgnd( HWND hwnd, HDC hdc, DESKTOPINFO *infoPtr )
 {
     RECT rect;
-
-      /* Set colors in case pattern is a monochrome bitmap */
-    SetBkColor( hdc, RGB(0,0,0) );
-    SetTextColor( hdc, GetSysColor(COLOR_BACKGROUND) );
     GetClientRect( hwnd, &rect );    
-    FillRect( hdc, &rect, infoPtr->hbrushPattern );
+
+    /* Paint desktop pattern (only if wall paper does not cover everything) */
+
+    if (!infoPtr->hbitmapWallPaper || 
+	(!infoPtr->fTileWallPaper && (infoPtr->bitmapSize.cx < rect.right) &&
+	 (infoPtr->bitmapSize.cy < rect.bottom)))
+    {
+	  /* Set colors in case pattern is a monochrome bitmap */
+	SetBkColor( hdc, RGB(0,0,0) );
+	SetTextColor( hdc, GetSysColor(COLOR_BACKGROUND) );
+	FillRect( hdc, &rect, infoPtr->hbrushPattern );
+    }
+
+      /* Paint wall paper */
+
+    if (infoPtr->hbitmapWallPaper)
+    {
+	int x, y;
+	HDC hdcmem;
+
+	hdcmem = CreateCompatibleDC( hdc );
+	SelectObject( hdcmem, infoPtr->hbitmapWallPaper );
+	if (infoPtr->fTileWallPaper)
+	{
+	    for (y = 0; y < rect.bottom; y += infoPtr->bitmapSize.cy)
+		for (x = 0; x < rect.right; x += infoPtr->bitmapSize.cx)
+		    BitBlt( hdc, x, y,
+			    infoPtr->bitmapSize.cx, infoPtr->bitmapSize.cy,
+			    hdcmem, 0, 0, SRCCOPY );
+	}
+	else
+	{
+	    x = (rect.left + rect.right - infoPtr->bitmapSize.cx) / 2;
+	    y = (rect.top + rect.bottom - infoPtr->bitmapSize.cy) / 2;
+	    if (x < 0) x = 0;
+	    if (y < 0) y = 0;
+	    BitBlt( hdc, x, y, infoPtr->bitmapSize.cx, infoPtr->bitmapSize.cy,
+		    hdcmem, 0, 0, SRCCOPY );
+	}
+	DeleteDC( hdcmem );
+    }
+
     return 1;
 }
 
@@ -50,6 +133,7 @@
 	infoPtr->hbrushPattern = 0;
 	infoPtr->hbitmapWallPaper = 0;
 	SetDeskPattern();
+	SetDeskWallPaper( (LPSTR)-1 );
 	break;
 	
     case WM_ERASEBKGND:
@@ -77,6 +161,30 @@
  */
 BOOL SetDeskWallPaper( LPSTR filename )
 {
+    HBITMAP hbitmap;
+    HDC hdc;
+    char buffer[256];
+    WND *wndPtr = WIN_FindWndPtr( GetDesktopWindow() );
+    DESKTOPINFO *infoPtr = (DESKTOPINFO *)wndPtr->wExtra;
+
+    if (filename == (LPSTR)-1)
+    {
+	GetProfileString( "desktop", "WallPaper", "(None)", buffer, 256 );
+	filename = buffer;
+    }
+    hdc = GetDC( 0 );
+    hbitmap = DESKTOP_LoadBitmap( hdc, filename );
+    ReleaseDC( 0, hdc );
+    if (infoPtr->hbitmapWallPaper) DeleteObject( infoPtr->hbitmapWallPaper );
+    infoPtr->hbitmapWallPaper = hbitmap;
+    infoPtr->fTileWallPaper = GetProfileInt( "desktop", "TileWallPaper", 0 );
+    if (hbitmap)
+    {
+	BITMAP bmp;
+	GetObject( hbitmap, sizeof(bmp), (LPSTR)&bmp );
+	infoPtr->bitmapSize.cx = (bmp.bmWidth != 0) ? bmp.bmWidth : 1;
+	infoPtr->bitmapSize.cy = (bmp.bmHeight != 0) ? bmp.bmHeight : 1;
+    }
     return TRUE;
 }
 
diff --git a/controls/edit.c b/controls/edit.c
index 2a1c12c..9779230 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -3,7 +3,7 @@
  *
  * Copyright  David W. Metcalfe, 1994
  *
- * Release 2, June 1994
+ * Release 3, July 1994
  */
 
 static char Copyright[] = "Copyright  David W. Metcalfe, 1994";
@@ -17,13 +17,19 @@
 #include "user.h"
 #include "scroll.h"
 
+#define EDIT_HEAP_ALLOC(size)          USER_HEAP_ALLOC(GMEM_MOVEABLE,size)
+#define EDIT_HEAP_REALLOC(handle,size) USER_HEAP_REALLOC(handle,size,\
+							 GMEM_MOVEABLE)
+#define EDIT_HEAP_ADDR(handle)         USER_HEAP_ADDR(handle)
+#define EDIT_HEAP_FREE(handle)         USER_HEAP_FREE(handle)
+
 /* #define DEBUG_EDIT /* */
 
 #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \
 	SendMessage(GetParent(hWndCntrl), WM_COMMAND, \
 		 GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode));
 
-#define MAXTEXTLEN 32000   /* maximum text buffer length */
+#define MAXTEXTLEN 30000   /* maximum text buffer length */
 #define EDITLEN     1024   /* starting length for multi-line control */
 #define ENTRYLEN     256   /* starting length for single line control */
 #define GROWLENGTH    64   /* buffers grow by this much */
@@ -31,11 +37,6 @@
 #define HSCROLLDIM (ClientWidth(wndPtr) / 3)
                            /* "line" dimension for horizontal scroll */
 
-#define EDIT_HEAP_ALLOC(size)          USER_HEAP_ALLOC(GMEM_MOVEABLE,size)
-#define EDIT_HEAP_REALLOC(handle,size) USER_HEAP_REALLOC(handle,size,\
-							 GMEM_MOVEABLE)
-#define EDIT_HEAP_ADDR(handle)         USER_HEAP_ADDR(handle)
-#define EDIT_HEAP_FREE(handle)         USER_HEAP_FREE(handle)
 
 typedef struct
 {
@@ -46,7 +47,6 @@
     int textwidth;           /* width of longest line in pixels */
     RECT fmtrc;              /* rectangle in which to format text */
     int txtht;               /* height of text line in pixels */
-    MDESC **localheap;       /* pointer to application's local heap */
     HANDLE hText;            /* handle to text buffer */
     HANDLE hCharWidths;      /* widths of chars in font */
     HANDLE hTextPtrs;        /* list of line offsets */
@@ -81,9 +81,9 @@
 #define CurrChar (EDIT_TextLine(hwnd, es->CurrLine) + es->CurrCol)
 #define SelMarked(es) (es->SelBegLine != 0 || es->SelBegCol != 0 || \
 		       es->SelEndLine != 0 || es->SelEndCol != 0)
-#define ROUNDUP(numer, denom) ((numer % denom) \
-			       ? (((numer + denom) / denom) * denom) \
-			       : numer)
+#define ROUNDUP(numer, denom) (((numer) % (denom)) \
+			       ? ((((numer) + (denom)) / (denom)) * (denom)) \
+			       : (numer) + (denom))
 
 /* macros to access window styles */
 #define IsAutoVScroll() (wndPtr->dwStyle & ES_AUTOVSCROLL)
@@ -109,16 +109,16 @@
 void EDIT_PaintMsg(HWND hwnd);
 HANDLE EDIT_GetTextLine(HWND hwnd, int selection);
 char *EDIT_TextLine(HWND hwnd, int sel);
-int EDIT_StrLength(EDITSTATE *es, char *str, int len, int pcol);
+int EDIT_StrLength(HWND hwnd, char *str, int len, int pcol);
 int EDIT_LineLength(HWND hwnd, int num);
 void EDIT_WriteTextLine(HWND hwnd, RECT *rc, int y);
 void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, 
 		    int col, RECT *rc, BOOL blank, BOOL reverse);
-HANDLE EDIT_GetStr(EDITSTATE *es, char *lp, int off, int len, int *diff);
+HANDLE EDIT_GetStr(HWND hwnd, char *lp, int off, int len, int *diff);
 void EDIT_CharMsg(HWND hwnd, WORD wParam);
 void EDIT_KeyTyped(HWND hwnd, short ch);
-int EDIT_CharWidth(EDITSTATE *es, short ch, int pcol);
-int EDIT_GetNextTabStop(EDITSTATE *es, int pcol);
+int EDIT_CharWidth(HWND hwnd, short ch, int pcol);
+int EDIT_GetNextTabStop(HWND hwnd, int pcol);
 void EDIT_Forward(HWND hwnd);
 void EDIT_Downward(HWND hwnd);
 void EDIT_Upward(HWND hwnd);
@@ -144,7 +144,7 @@
 int EDIT_PixelToChar(HWND hwnd, int row, int *pixel);
 LONG EDIT_SetTextMsg(HWND hwnd, LONG lParam);
 void EDIT_ClearText(HWND hwnd);
-void EDIT_SetSelMsg(HWND hwnd, LONG lParam);
+void EDIT_SetSelMsg(HWND hwnd, WORD wParam, LONG lParam);
 void EDIT_GetLineCol(HWND hwnd, int off, int *line, int *col);
 void EDIT_DeleteSel(HWND hwnd);
 void EDIT_ClearSel(HWND hwnd);
@@ -165,9 +165,11 @@
 			  int col);
 void EDIT_ClearDeletedText(HWND hwnd);
 LONG EDIT_UndoMsg(HWND hwnd);
-unsigned int EDIT_TextAlloc(EDITSTATE *es, int bytes);
-void *EDIT_TextAddr(EDITSTATE *es, unsigned int handle);
-unsigned int EDIT_TextReAlloc(EDITSTATE *es, unsigned int handle, int bytes);
+unsigned int EDIT_HeapAlloc(HWND hwnd, int bytes);
+void *EDIT_HeapAddr(HWND hwnd, unsigned int handle);
+unsigned int EDIT_HeapReAlloc(HWND hwnd, unsigned int handle, int bytes);
+void EDIT_HeapFree(HWND hwnd, unsigned int handle);
+unsigned int EDIT_HeapSize(HWND hwnd, unsigned int handle);
 void EDIT_SetHandleMsg(HWND hwnd, WORD wParam);
 LONG EDIT_SetTabStopsMsg(HWND hwnd, WORD wParam, LONG lParam);
 void swap(int *a, int *b);
@@ -180,7 +182,8 @@
     char *textPtr;
     int len;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     switch (uMsg) {
     case EM_CANUNDO:
@@ -244,8 +247,10 @@
     case EM_LIMITTEXT:
 	if (wParam)
 	    es->MaxTextLen = wParam;
+	else if (IsMultiLine())
+	    es->MaxTextLen = 65535;
 	else
-	    es->MaxTextLen = 65000;
+	    es->MaxTextLen = 32767;
 	break;
 
     case EM_LINEFROMCHAR:
@@ -297,7 +302,7 @@
 
     case EM_SETSEL:
 	HideCaret(hwnd);
-	EDIT_SetSelMsg(hwnd, lParam);
+	EDIT_SetSelMsg(hwnd, wParam, lParam);
 	SetCaretPos(es->WndCol, es->WndRow * es->txtht);
 	ShowCaret(hwnd);
 	break;
@@ -326,9 +331,10 @@
 	break;
 
     case WM_DESTROY:
-	EDIT_HEAP_FREE(es->hTextPtrs);
-	EDIT_HEAP_FREE(es->hCharWidths);
-	EDIT_HEAP_FREE((HANDLE)(*(wndPtr->wExtra)));
+	EDIT_HeapFree(hwnd, es->hTextPtrs);
+	EDIT_HeapFree(hwnd, es->hCharWidths);
+	EDIT_HeapFree(hwnd, es->hText);
+	EDIT_HeapFree(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 	break;
 
     case WM_ENABLE:
@@ -336,7 +342,7 @@
 	break;
 
     case WM_GETTEXT:
-	textPtr = EDIT_TextAddr(es, es->hText);
+	textPtr = EDIT_HeapAddr(hwnd, es->hText);
 	if ((int)wParam > (len = strlen(textPtr)))
 	{
 	    strcpy((char *)lParam, textPtr);
@@ -347,7 +353,7 @@
 	break;
 
     case WM_GETTEXTLENGTH:
-	textPtr = EDIT_TextAddr(es, es->hText);
+	textPtr = EDIT_HeapAddr(hwnd, es->hText);
 	lResult = (DWORD)strlen(textPtr);
 	break;
 
@@ -398,7 +404,6 @@
 	break;
 
     case WM_SETFOCUS:
-	es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
 	CreateCaret(hwnd, 0, 2, es->txtht);
 	SetCaretPos(es->WndCol, es->WndRow * es->txtht);
 	ShowCaret(hwnd);
@@ -448,22 +453,25 @@
     char *text;
     int len;
 
+    /* store pointer to local heap in window structure so that */
+    /* EDITSTATE structure itself can be stored on local heap  */
+    (MDESC **)*(LONG *)(wndPtr->wExtra + 2) = 
+	&HEAP_LocalFindHeap(createStruct->hInstance)->free_list;
+
     /* allocate space for state variable structure */
-    (HANDLE)(*(wndPtr->wExtra)) = 
-	EDIT_HEAP_ALLOC(sizeof(EDITSTATE));
-    es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    es->hTextPtrs = EDIT_HEAP_ALLOC(sizeof(int));
-    textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
-    es->hCharWidths = EDIT_HEAP_ALLOC(256 * sizeof(short));
+    (HANDLE)(*(wndPtr->wExtra)) = EDIT_HeapAlloc(hwnd, sizeof(EDITSTATE));
+    es = (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    es->hTextPtrs = EDIT_HeapAlloc(hwnd, sizeof(int));
+    textPtrs = (unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
+    es->hCharWidths = EDIT_HeapAlloc(hwnd, 256 * sizeof(short));
 
     /* --- text buffer */
-    es->localheap = &HEAP_LocalFindHeap(createStruct->hInstance)->free_list;
     es->MaxTextLen = MAXTEXTLEN + 1;
     if (!(createStruct->lpszName))
     {
 	es->textlen = EditBufLen(wndPtr) + 1;
-	es->hText = EDIT_TextAlloc(es, EditBufLen(wndPtr) + 2);
-	text = EDIT_TextAddr(es, es->hText);
+	es->hText = EDIT_HeapAlloc(hwnd, EditBufLen(wndPtr) + 2);
+	text = EDIT_HeapAddr(hwnd, es->hText);
 	memset(text, 0, es->textlen + 2);
 	EDIT_ClearTextPointers(hwnd);
     }
@@ -471,16 +479,17 @@
     {
 	if (strlen(createStruct->lpszName) < EditBufLen(wndPtr))
 	{
-	    es->hText = EDIT_TextAlloc(es, EditBufLen(wndPtr) + 2);
-	    text = EDIT_TextAddr(es, es->hText);
+	    es->hText = EDIT_HeapAlloc(hwnd, EditBufLen(wndPtr) + 2);
+	    text = EDIT_HeapAddr(hwnd, es->hText);
 	    strcpy(text, createStruct->lpszName);
 	    *(text + es->textlen) = '\0';
 	    es->textlen = EditBufLen(wndPtr) + 1;
 	}
 	else
 	{
-	    es->hText = EDIT_TextAlloc(es, strlen(createStruct->lpszName) + 2);
-	    text = EDIT_TextAddr(es, es->hText);
+	    es->hText = EDIT_HeapAlloc(hwnd, 
+				       strlen(createStruct->lpszName) + 2);
+	    text = EDIT_HeapAddr(hwnd, es->hText);
 	    strcpy(text, createStruct->lpszName);
 	    es->textlen = strlen(createStruct->lpszName) + 1;
 	}
@@ -491,6 +500,13 @@
     if ((createStruct->style & WS_VSCROLL) || 
 	(createStruct->style & WS_HSCROLL)) NC_CreateScrollBars(hwnd);
 
+    /* ES_AUTOVSCROLL and ES_AUTOHSCROLL are automatically applied if */
+    /* the corresponding WM_* message is set                          */
+    if (createStruct->style & WS_VSCROLL)
+	wndPtr->dwStyle |= ES_AUTOVSCROLL;
+    if (createStruct->style & WS_HSCROLL)
+	wndPtr->dwStyle |= ES_AUTOHSCROLL;
+
     /* remove the WS_CAPTION style if it has been set - this is really a  */
     /* pseudo option made from a combination of WS_BORDER and WS_DLGFRAME */
     if (wndPtr->dwStyle & WS_BORDER && wndPtr->dwStyle & WS_DLGFRAME)
@@ -508,7 +524,8 @@
 {
     HDC hdc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     CLASS *classPtr;
     short *charWidths;
     TEXTMETRIC tm;
@@ -517,7 +534,7 @@
     /* initialize state variable structure */
     /* --- char width array */
     hdc = GetDC(hwnd);
-    charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths);
+    charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths);
     memset(charWidths, 0, 256 * sizeof(short));
     GetCharWidth(hdc, 0, 255, charWidths);
 
@@ -536,13 +553,13 @@
     es->hDeletedText = 0;
     es->DeletedLength = 0;
     es->NumTabStops = 0;
-    es->hTabStops = EDIT_HEAP_ALLOC(sizeof(int));
+    es->hTabStops = EDIT_HeapAlloc(hwnd, sizeof(int));
 
     /* allocate space for a line full of blanks to speed up */
     /* line filling */
-    es->hBlankLine = EDIT_HEAP_ALLOC((ClientWidth(wndPtr) / 
+    es->hBlankLine = EDIT_HeapAlloc(hwnd, (ClientWidth(wndPtr) / 
 				      charWidths[32]) + 2); 
-    text = EDIT_HEAP_ADDR(es->hBlankLine);
+    text = EDIT_HeapAddr(hwnd, es->hBlankLine);
     memset(text, ' ', (ClientWidth(wndPtr) / charWidths[32]) + 2);
 
     /* set up text cursor for edit class */
@@ -567,10 +584,11 @@
 {
     unsigned int *textPtrs;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     
-    es->hTextPtrs = EDIT_HEAP_REALLOC(es->hTextPtrs, sizeof(int));
-    textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    es->hTextPtrs = EDIT_HeapReAlloc(hwnd, es->hTextPtrs, sizeof(int));
+    textPtrs = (unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
     *textPtrs = 0;
 }
 
@@ -593,10 +611,10 @@
     unsigned int *textPtrs;
     short *charWidths;
 
-    es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    text = EDIT_TextAddr(es, es->hText);
-    textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
-    charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths);
+    es = (EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    text = EDIT_HeapAddr(hwnd, es->hText);
+    textPtrs = (unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
+    charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths);
 
     es->textwidth = es->wlines = 0;
     cp = text;
@@ -608,9 +626,9 @@
 	if (incrs == INITLINES)
 	{
 	    incrs = 0;
-	    es->hTextPtrs = EDIT_HEAP_REALLOC(es->hTextPtrs,
+	    es->hTextPtrs = EDIT_HeapReAlloc(hwnd, es->hTextPtrs,
 			      (es->wlines + INITLINES) * sizeof(int));
-	    textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+	    textPtrs = (unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 	}
 	off = (unsigned int)(cp - text);     /* offset of beginning of line */
 	*(textPtrs + es->wlines) = off;
@@ -621,7 +639,8 @@
 	/* advance through current line */
 	while (*cp && *cp != '\n')
 	{
-	    len += EDIT_CharWidth(es, *cp, len); /* width of line in pixels */
+	    len += EDIT_CharWidth(hwnd, *cp, len);
+	                                     /* width of line in pixels */
 	    cp++;
 	}
 	es->textwidth = max(es->textwidth, len);
@@ -643,8 +662,10 @@
 void EDIT_ModTextPointers(HWND hwnd, int lineno, int var)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     while (lineno < es->wlines)
 	*(textPtrs + lineno++) += var;
@@ -662,7 +683,8 @@
     int y;
     RECT rc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     hdc = BeginPaint(hwnd, &ps);
     rc = ps.rcPaint;
@@ -710,8 +732,8 @@
     }
 
     /* store selected line and return handle */
-    hLine = EDIT_HEAP_ALLOC(len + 6);
-    line = (char *)EDIT_HEAP_ADDR(hLine);
+    hLine = EDIT_HeapAlloc(hwnd, len + 6);
+    line = (char *)EDIT_HeapAddr(hwnd, hLine);
     memmove(line, cp1, len);
     line[len] = '\0';
     return hLine;
@@ -727,9 +749,11 @@
 char *EDIT_TextLine(HWND hwnd, int sel)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     return (text + *(textPtrs + sel));
 }
@@ -743,12 +767,15 @@
  *  the width of a tab.
  */
 
-int EDIT_StrLength(EDITSTATE *es, char *str, int len, int pcol)
+int EDIT_StrLength(HWND hwnd, char *str, int len, int pcol)
 {
     int i, plen = 0;
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     for (i = 0; i < len; i++)
-	plen += EDIT_CharWidth(es, *(str + i), pcol + plen);
+	plen += EDIT_CharWidth(hwnd, *(str + i), pcol + plen);
 
 #ifdef DEBUG_EDIT
     printf("EDIT_StrLength: returning %d\n", plen);
@@ -766,7 +793,8 @@
 int EDIT_LineLength(HWND hwnd, int num)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     char *cp = EDIT_TextLine(hwnd, num);
     char *cp1;
 
@@ -791,10 +819,10 @@
     int col, off = 0;
     int sbl, sel, sbc, sec;
     RECT rc;
-
     BOOL trunc = FALSE;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     /* initialize rectangle if NULL, else copy */
     if (rect)
@@ -844,8 +872,8 @@
     /* get the text and length of line */
     if ((hLine = EDIT_GetTextLine(hwnd, y)) == 0)
 	return;
-    lp = (unsigned char *)EDIT_HEAP_ADDR(hLine);
-    lnlen = EDIT_StrLength(es, lp, strlen(lp), 0);
+    lp = (unsigned char *)EDIT_HeapAddr(hwnd, hLine);
+    lnlen = EDIT_StrLength(hwnd, lp, strlen(lp), 0);
     lnlen1 = lnlen;
 
     /* build the line to display */
@@ -885,7 +913,7 @@
 			   TRUE, TRUE);
 	else if (y == sbl)
 	{
-	    col = EDIT_StrLength(es, lp, sbc, 0);
+	    col = EDIT_StrLength(hwnd, lp, sbc, 0);
 	    if (col > (es->wleft + rc.left))
 	    {
 		len = min(col - off, rc.right - off);
@@ -895,7 +923,7 @@
 	    }
 	    if (y == sel)
 	    {
-		col = EDIT_StrLength(es, lp, sec, 0);
+		col = EDIT_StrLength(hwnd, lp, sec, 0);
 		if (col < (es->wleft + rc.right))
 		{
 		    len = min(col - off, rc.right - off);
@@ -923,7 +951,7 @@
 	}
 	else if (y == sel)
 	{
-	    col = EDIT_StrLength(es, lp, sec, 0);
+	    col = EDIT_StrLength(hwnd, lp, sec, 0);
 	    if (col < (es->wleft + rc.right))
 	    {
 		len = min(col - off, rc.right - off);
@@ -940,7 +968,7 @@
 	EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, rc.left, &rc,
 		       TRUE, FALSE);
 	      
-    EDIT_HEAP_FREE(hLine);
+    EDIT_HeapFree(hwnd, hLine);
 }
 
 
@@ -969,17 +997,18 @@
     COLORREF oldTextColor, oldBkgdColor;
     HFONT oldfont;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths);
-    char *blanks = (char *)EDIT_HEAP_ADDR(es->hBlankLine);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    short *charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths);
+    char *blanks = (char *)EDIT_HeapAddr(hwnd, es->hBlankLine);
 
 #ifdef DEBUG_EDIT
     printf("EDIT_WriteText lp=%s, off=%d, len=%d, row=%d, col=%d, reverse=%d\n", lp, off, len, row, col, reverse);
 #endif
 
     hdc = GetDC(hwnd);
-    hStr = EDIT_GetStr(es, lp, off, len, &diff);
-    str = (char *)EDIT_HEAP_ADDR(hStr);
+    hStr = EDIT_GetStr(hwnd, lp, off, len, &diff);
+    str = (char *)EDIT_HeapAddr(hwnd, hStr);
     hrgnClip = CreateRectRgnIndirect(rc);
     SelectClipRgn(hdc, hrgnClip);
 
@@ -1002,8 +1031,8 @@
     else
     {
 	TextOut(hdc, col - diff, row * es->txtht, str, (int)(cp - str));
-	scol = EDIT_StrLength(es, str, (int)(cp - str), 0);
-	tabwidth = EDIT_CharWidth(es, VK_TAB, scol);
+	scol = EDIT_StrLength(hwnd, str, (int)(cp - str), 0);
+	tabwidth = EDIT_CharWidth(hwnd, VK_TAB, scol);
 	num_spaces = tabwidth / charWidths[32] + 1;
 	TextOut(hdc, scol, row * es->txtht, blanks, num_spaces);
 	cp++;
@@ -1012,8 +1041,8 @@
 	while (cp1 = strchr(cp, VK_TAB))
 	{
 	    TextOut(hdc, scol, row * es->txtht, cp, (int)(cp1 - cp));
-	    scol = EDIT_StrLength(es, cp, (int)(cp1 - cp), scol);
-	    tabwidth = EDIT_CharWidth(es, VK_TAB, scol);
+	    scol += EDIT_StrLength(hwnd, cp, (int)(cp1 - cp), scol);
+	    tabwidth = EDIT_CharWidth(hwnd, VK_TAB, scol);
 	    num_spaces = tabwidth / charWidths[32] + 1;
 	    TextOut(hdc, scol, row * es->txtht, blanks, num_spaces);
 	    cp = ++cp1;
@@ -1042,7 +1071,7 @@
     if (es->hFont)
 	SelectObject(hdc, (HANDLE)oldfont);
 
-    EDIT_HEAP_FREE(hStr);
+    EDIT_HeapFree(hwnd, hStr);
     ReleaseDC(hwnd, hdc);
 }
 
@@ -1056,12 +1085,15 @@
  *  will be zero.
  */
 
-HANDLE EDIT_GetStr(EDITSTATE *es, char *lp, int off, int len, int *diff)
+HANDLE EDIT_GetStr(HWND hwnd, char *lp, int off, int len, int *diff)
 {
     HANDLE hStr;
     char *str;
     int ch = 0, i = 0, j, s_i;
     int ch1;
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_GetStr %s %d %d\n", lp, off, len);
@@ -1070,7 +1102,7 @@
     while (i < off)
     {
 	s_i = i;
-	i += EDIT_CharWidth(es, *(lp + ch), i);
+	i += EDIT_CharWidth(hwnd, *(lp + ch), i);
 	ch++;
     }
 
@@ -1085,12 +1117,12 @@
 
     while (i < len + off)
     {
-	i += EDIT_CharWidth(es, *(lp + ch), i);
+	i += EDIT_CharWidth(hwnd, *(lp + ch), i);
 	ch++;
     }
     
-    hStr = EDIT_HEAP_ALLOC(ch - ch1 + 3);
-    str = (char *)EDIT_HEAP_ADDR(hStr);
+    hStr = EDIT_HeapAlloc(hwnd, ch - ch1 + 3);
+    str = (char *)EDIT_HeapAddr(hwnd, hStr);
     for (i = ch1, j = 0; i < ch; i++, j++)
 	str[j] = lp[i];
     str[++j] = '\0';
@@ -1108,7 +1140,8 @@
 void EDIT_CharMsg(HWND hwnd, WORD wParam)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_CharMsg: wParam=%c\n", (char)wParam);
@@ -1124,6 +1157,12 @@
 	EDIT_KeyTyped(hwnd, wParam);
 	break;
 
+    case VK_TAB:
+	if (!IsMultiLine())
+	    break;
+	EDIT_KeyTyped(hwnd, wParam);
+	break;
+
     default:
 	if (wParam >= 20 && wParam <= 126)
 	    EDIT_KeyTyped(hwnd, wParam);
@@ -1141,8 +1180,9 @@
 void EDIT_KeyTyped(HWND hwnd, short ch)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
     char *currchar = CurrChar;
     RECT rc;
     BOOL FullPaint = FALSE;
@@ -1186,10 +1226,10 @@
 	/* but not above maximum size */
 	if (es->textlen > es->MaxTextLen)
 	    es->textlen = es->MaxTextLen;
-	es->hText = EDIT_TextReAlloc(es, es->hText, es->textlen + 2);
+	es->hText = EDIT_HeapReAlloc(hwnd, es->hText, es->textlen + 2);
 	if (!es->hText)
 	    NOTIFY_PARENT(hwnd, EN_ERRSPACE);
-	text = EDIT_TextAddr(es, es->hText);
+	text = EDIT_HeapAddr(hwnd, es->hText);
 	text[es->textlen - 1] = '\0';
 	currchar = CurrChar;
     }
@@ -1205,13 +1245,13 @@
     if (IsMultiLine() && es->wlines > 1)
     {
 	es->textwidth = max(es->textwidth,
-		    EDIT_StrLength(es, EDIT_TextLine(hwnd, es->CurrLine),
+		    EDIT_StrLength(hwnd, EDIT_TextLine(hwnd, es->CurrLine),
 		    (int)(EDIT_TextLine(hwnd, es->CurrLine + 1) -
 			  EDIT_TextLine(hwnd, es->CurrLine)), 0));
     }
     else
 	es->textwidth = max(es->textwidth,
-			    EDIT_StrLength(es, text, strlen(text), 0));
+			    EDIT_StrLength(hwnd, text, strlen(text), 0));
     EDIT_WriteTextLine(hwnd, NULL, es->wtop + es->WndRow);
 
     if (ch == '\n')
@@ -1238,14 +1278,14 @@
 
     /* test end of window */
     if (es->WndCol >= ClientWidth(wndPtr) - 
-	                    EDIT_CharWidth(es, ch, es->WndCol + es->wleft))
+	                    EDIT_CharWidth(hwnd, ch, es->WndCol + es->wleft))
     {
 	/* TODO:- Word wrap to be handled here */
 
 /*	if (!(currchar == text + es->MaxTextLen - 2)) */
 	    EDIT_KeyHScroll(hwnd, SB_LINEDOWN);
     }
-    es->WndCol += EDIT_CharWidth(es, ch, es->WndCol + es->wleft);
+    es->WndCol += EDIT_CharWidth(hwnd, ch, es->WndCol + es->wleft);
     es->CurrCol++;
     SetCaretPos(es->WndCol, es->WndRow * es->txtht);
     ShowCaret(hwnd);
@@ -1261,14 +1301,17 @@
  *  the width of a tab.
  */
 
-int EDIT_CharWidth(EDITSTATE *es, short ch, int pcol)
+int EDIT_CharWidth(HWND hwnd, short ch, int pcol)
 {
-    short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths);
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    short *charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths);
 
     if (ch != VK_TAB)
 	return (charWidths[ch]);
     else
-	return (EDIT_GetNextTabStop(es, pcol) - pcol);
+	return (EDIT_GetNextTabStop(hwnd, pcol) - pcol);
 }
 
 
@@ -1278,14 +1321,17 @@
  *  Return the next tab stop beyond _pcol_.
  */
 
-int EDIT_GetNextTabStop(EDITSTATE *es, int pcol)
+int EDIT_GetNextTabStop(HWND hwnd, int pcol)
 {
-    int i;
+    int i, tmp;
     int baseUnitWidth = LOWORD(GetDialogBaseUnits());
-    unsigned short *tabstops = EDIT_HEAP_ADDR(es->hTabStops);
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    unsigned short *tabstops = EDIT_HeapAddr(hwnd, es->hTabStops);
 
     if (es->NumTabStops == 0)
-	return ROUNDUP(pcol, 8);
+	return ROUNDUP(pcol, 8 * baseUnitWidth);
     else if (es->NumTabStops == 1)
 	return ROUNDUP(pcol, *tabstops * baseUnitWidth / 4);
     else
@@ -1309,8 +1355,9 @@
 void EDIT_Forward(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
 
     if (*CurrChar == '\0')
 	return;
@@ -1322,7 +1369,7 @@
     }
     else
     {
-	es->WndCol += EDIT_CharWidth(es, *CurrChar, es->WndCol + es->wleft);
+	es->WndCol += EDIT_CharWidth(hwnd, *CurrChar, es->WndCol + es->wleft);
 	es->CurrCol++;
 	if (es->WndCol >= ClientWidth(wndPtr))
 	    EDIT_KeyHScroll(hwnd, SB_LINEDOWN);
@@ -1340,7 +1387,8 @@
 void EDIT_Downward(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_Downward: WndRow=%d, wtop=%d, wlines=%d\n", es->WndRow, es->wtop, es->wlines);
@@ -1370,7 +1418,8 @@
 void EDIT_Upward(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (IsMultiLine() && es->CurrLine != 0)
     {
@@ -1396,13 +1445,20 @@
 void EDIT_Backward(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
 
     if (es->CurrCol)
     {
 	--es->CurrCol;
-	es->WndCol -= EDIT_CharWidth(es, *CurrChar, es->WndCol + es->wleft);
+	if (*CurrChar == VK_TAB)
+	    es->WndCol -= EDIT_CharWidth(hwnd, *CurrChar, 
+					 EDIT_StrLength(hwnd, 
+					 EDIT_TextLine(hwnd, es->CurrLine), 
+					 es->CurrCol, 0));
+	else
+	    es->WndCol -= EDIT_CharWidth(hwnd, *CurrChar, 0);
 	if (es->WndCol < 0)
 	    EDIT_KeyHScroll(hwnd, SB_LINEUP);
     }
@@ -1424,12 +1480,13 @@
 {
     RECT rc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
 
     while (*CurrChar && *CurrChar != '\n')
     {
-	es->WndCol += EDIT_CharWidth(es, *CurrChar, es->WndCol + es->wleft);
+	es->WndCol += EDIT_CharWidth(hwnd, *CurrChar, es->WndCol + es->wleft);
 	es->CurrCol++;
     }
 
@@ -1453,7 +1510,8 @@
 {
     RECT rc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     es->CurrCol = es->WndCol = 0;
     if (es->wleft != 0)
@@ -1474,14 +1532,15 @@
 void EDIT_StickEnd(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     int len = EDIT_LineLength(hwnd, es->CurrLine);
     char *cp = EDIT_TextLine(hwnd, es->CurrLine);
     char currpel;
 
     es->CurrCol = min(len, es->CurrCol);
-    es->WndCol = min(EDIT_StrLength(es, cp, len, 0) - es->wleft, es->WndCol);
-    currpel = EDIT_StrLength(es, cp, es->CurrCol, 0);
+    es->WndCol = min(EDIT_StrLength(hwnd, cp, len, 0) - es->wleft, es->WndCol);
+    currpel = EDIT_StrLength(hwnd, cp, es->CurrCol, 0);
 
     if (es->wleft > currpel)
     {
@@ -1505,7 +1564,8 @@
 void EDIT_KeyDownMsg(HWND hwnd, WORD wParam)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_KeyDownMsg: key=%x\n", wParam);
@@ -1610,7 +1670,8 @@
     RECT rc;
     int hscrollpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (opt == SB_LINEDOWN)
     {
@@ -1655,7 +1716,8 @@
     RECT rc;
     int y, vscrollpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (!IsMultiLine())
 	return;
@@ -1720,7 +1782,8 @@
     RECT rc;
     int vscrollpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (IsMultiLine())
     {
@@ -1767,7 +1830,8 @@
     RECT rc;
     int vscrollpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (!IsMultiLine())
 	return;
@@ -1807,7 +1871,8 @@
     int vscrollpos;
     short minpos, maxpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     GetScrollRange(hwnd, SB_VERT, &minpos, &maxpos);
 
@@ -1833,7 +1898,8 @@
     int hscrollpos;
     short minpos, maxpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     GetScrollRange(hwnd, SB_HORZ, &minpos, &maxpos);
 
@@ -1857,7 +1923,8 @@
 {
     RECT rc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     char *currchar = CurrChar;
     BOOL repaint = *currchar == '\n';
 
@@ -1891,7 +1958,8 @@
 void EDIT_VScrollMsg(HWND hwnd, WORD wParam, LONG lParam)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (IsMultiLine())
     {
@@ -1927,7 +1995,8 @@
     RECT rc;
     int y;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_VScrollLine: direction=%d\n", opt);
@@ -1986,7 +2055,8 @@
     RECT rc;
     int vscrollpos;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (opt == SB_PAGEUP)
     {
@@ -2024,7 +2094,8 @@
 void EDIT_HScrollMsg(HWND hwnd, WORD wParam, LONG lParam)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     switch (wParam)
     {
@@ -2047,7 +2118,8 @@
 {
     RECT rc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (wParam != SIZE_MAXIMIZED && wParam != SIZE_RESTORED) return;
 
@@ -2067,7 +2139,8 @@
     int len;
     BOOL end = FALSE;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (SelMarked(es))
 	EDIT_ClearSel(hwnd);
@@ -2086,8 +2159,8 @@
     cp = EDIT_TextLine(hwnd, es->CurrLine);
     len = EDIT_LineLength(hwnd, es->CurrLine);
     es->WndCol = LOWORD(lParam);
-    if (es->WndCol > EDIT_StrLength(es, cp, len, 0) - es->wleft || end)
-	es->WndCol = EDIT_StrLength(es, cp, len, 0) - es->wleft;
+    if (es->WndCol > EDIT_StrLength(hwnd, cp, len, 0) - es->wleft || end)
+	es->WndCol = EDIT_StrLength(hwnd, cp, len, 0) - es->wleft;
     es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol));
 
     ButtonDown = TRUE;
@@ -2130,7 +2203,8 @@
     int ch = 0, i = 0, s_i;
     char *text;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_PixelToChar: row=%d, pixel=%d\n", row, *pixel);
@@ -2140,7 +2214,7 @@
     while (i < *pixel)
     {
 	s_i = i;
-	i += EDIT_CharWidth(es, *(text + ch), i);
+	i += EDIT_CharWidth(hwnd, *(text + ch), i);
 	ch++;
     }
 
@@ -2165,17 +2239,17 @@
     char *text;
     RECT rc;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (strlen((char *)lParam) <= es->MaxTextLen)
     {
 	len = strlen((char *)lParam);
 	EDIT_ClearText(hwnd);
 	es->textlen = len;
-	es->hText = EDIT_TextReAlloc(es, es->hText, len + 3);
-	text = EDIT_TextAddr(es, es->hText);
+	es->hText = EDIT_HeapReAlloc(hwnd, es->hText, len + 3);
+	text = EDIT_HeapAddr(hwnd, es->hText);
 	strcpy(text, (char *)lParam);
-/*	text[len] = '\n'; */ /* Removed by Bob Amstadt */
 	text[len + 1] = '\0';
 	text[len + 2] = '\0';
 	EDIT_BuildTextPointers(hwnd);
@@ -2198,12 +2272,13 @@
 void EDIT_ClearText(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     unsigned int blen = EditBufLen(wndPtr) + 2;
     char *text;
 
-    es->hText = EDIT_TextReAlloc(es, es->hText, blen);
-    text = EDIT_TextAddr(es, es->hText);
+    es->hText = EDIT_HeapReAlloc(hwnd, es->hText, blen);
+    text = EDIT_HeapAddr(hwnd, es->hText);
     memset(text, 0, blen);
     es->textlen = 0;
     es->wlines = 0;
@@ -2220,35 +2295,90 @@
  *  EM_SETSEL message function
  */
 
-void EDIT_SetSelMsg(HWND hwnd, LONG lParam)
+void EDIT_SetSelMsg(HWND hwnd, WORD wParam, LONG lParam)
 {
     int so, eo;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     so = LOWORD(lParam);
     eo = HIWORD(lParam);
-    if (so > eo)
-	swap(&so, &eo);
 
-    EDIT_GetLineCol(hwnd, so, &(es->SelBegLine), &(es->SelBegCol));
-    EDIT_GetLineCol(hwnd, eo, &(es->SelEndLine), &(es->SelEndCol));
-
-    if (SelMarked(es))
+    if (so == -1)       /* if so == -1, clear selection */
     {
+	EDIT_ClearSel(hwnd);
+	return;
+    }
+
+    if (so == eo)       /* if so == eo, set caret only */
+    {
+	EDIT_GetLineCol(hwnd, so, &(es->CurrLine), &(es->CurrCol));
+	es->WndRow = es->CurrLine - es->wtop;
+
+	if (!wParam)
+	{
+	    if (es->WndRow < 0 || es->WndRow > ClientHeight(wndPtr, es))
+	    {
+		es->wtop = es->CurrLine;
+		es->WndRow = 0;
+	    }
+	    es->WndCol = EDIT_StrLength(hwnd, 
+					EDIT_TextLine(hwnd, es->CurrLine), 
+					es->CurrCol, 0) - es->wleft;
+	    if (es->WndCol > ClientWidth(wndPtr))
+	    {
+		es->wleft = es->WndCol;
+		es->WndCol = 0;
+	    }
+	    else if (es->WndCol < 0)
+	    {
+		es->wleft += es->WndCol;
+		es->WndCol = 0;
+	    }
+	}
+    }
+    else                /* otherwise set selection */
+    {
+	if (so > eo)
+	    swap(&so, &eo);
+
+	EDIT_GetLineCol(hwnd, so, &(es->SelBegLine), &(es->SelBegCol));
+	EDIT_GetLineCol(hwnd, eo, &(es->SelEndLine), &(es->SelEndCol));
 	es->CurrLine = es->SelEndLine;
 	es->CurrCol = es->SelEndCol;
 	es->WndRow = es->SelEndLine - es->wtop;
-	if (es->WndRow < 0)
+
+	if (!wParam)          /* don't suppress scrolling of text */
 	{
-	    es->wtop = es->SelEndLine;
-	    es->WndRow = 0;
+	    if (es->WndRow < 0)
+	    {
+		es->wtop = es->SelEndLine;
+		es->WndRow = 0;
+	    }
+	    else if (es->WndRow > ClientHeight(wndPtr, es))
+	    {
+		es->wtop += es->WndRow - ClientHeight(wndPtr, es);
+		es->WndRow = ClientHeight(wndPtr, es);
+	    }
+	    es->WndCol = EDIT_StrLength(hwnd, 
+					EDIT_TextLine(hwnd, es->SelEndLine), 
+					es->SelEndCol, 0) - es->wleft;
+	    if (es->WndCol > ClientWidth(wndPtr))
+	    {
+		es->wleft += es->WndCol - ClientWidth(wndPtr);
+		es->WndCol = ClientWidth(wndPtr);
+	    }
+	    else if (es->WndCol < 0)
+	    {
+		es->wleft += es->WndCol;
+		es->WndCol = 0;
+	    }
 	}
-	es->WndCol = EDIT_StrLength(es, EDIT_TextLine(hwnd, es->SelEndLine), 
-				     es->SelEndCol, 0) - es->wleft;
+
+	InvalidateRect(hwnd, NULL, TRUE);
+	UpdateWindow(hwnd);
     }
-    InvalidateRect(hwnd, NULL, TRUE);
-    UpdateWindow(hwnd);
 }
 
 
@@ -2263,9 +2393,11 @@
     int lineno;
     char *cp, *cp1;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     /* check for (0,0) */
     if (!off)
@@ -2310,8 +2442,9 @@
     char *bbl, *bel;
     int len;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
 
     if (SelMarked(es))
     {
@@ -2330,7 +2463,7 @@
 	    es->wtop = es->SelBegLine;
 	    es->WndRow = 0;
 	}
-	es->WndCol = EDIT_StrLength(es, bbl - es->SelBegCol, 
+	es->WndCol = EDIT_StrLength(hwnd, bbl - es->SelBegCol, 
 				     es->SelBegCol, 0) - es->wleft;
 
 	EDIT_BuildTextPointers(hwnd);
@@ -2349,7 +2482,8 @@
 void EDIT_ClearSel(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     es->SelBegLine = es->SelBegCol = 0;
     es->SelEndLine = es->SelEndCol = 0;
@@ -2371,9 +2505,11 @@
     int lineno;
     char *cp;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     for (lineno = 0; lineno < es->wlines; lineno++)
     {
@@ -2397,7 +2533,8 @@
 {
     BOOL sel = FALSE;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (SelMarked(es))
 	sel = TRUE;
@@ -2425,7 +2562,8 @@
     int len;
     BOOL end = FALSE;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_ExtendSel: x=%d, y=%d\n", x, y);
@@ -2449,8 +2587,8 @@
     es->SelEndLine = es->CurrLine;
 
     es->WndCol = x;
-    if (es->WndCol > EDIT_StrLength(es, cp, len, 0) - es->wleft || end)
-	es->WndCol = EDIT_StrLength(es, cp, len, 0) - es->wleft;
+    if (es->WndCol > EDIT_StrLength(hwnd, cp, len, 0) - es->wleft || end)
+	es->WndCol = EDIT_StrLength(hwnd, cp, len, 0) - es->wleft;
     es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol));
     es->SelEndCol = es->CurrCol - 1;
 
@@ -2500,7 +2638,8 @@
     HBRUSH hbrush, holdbrush;
     int olddm;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
 #ifdef DEBUG_EDIT
     printf("EDIT_WriteSel: y=%d start=%d end=%d\n", y, start, end);
@@ -2518,10 +2657,10 @@
     if (end == -1)
 	end = EDIT_LineLength(hwnd, y);
 
-    scol = EDIT_StrLength(es, cp, start, 0);
+    scol = EDIT_StrLength(hwnd, cp, start, 0);
     if (scol > rc.right) return;
     if (scol < rc.left) scol = rc.left;
-    ecol = EDIT_StrLength(es, cp, end, 0);
+    ecol = EDIT_StrLength(hwnd, cp, end, 0);
     if (ecol < rc.left) return;
     if (ecol > rc.right) ecol = rc.right;
 
@@ -2545,7 +2684,8 @@
 void EDIT_StopMarking(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     TextMarking = FALSE;
     if (es->SelBegLine > es->SelEndLine)
@@ -2568,7 +2708,8 @@
     int len;
     char *buffer = (char *)lParam;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     cp = EDIT_TextLine(hwnd, wParam);
     cp1 = EDIT_TextLine(hwnd, wParam + 1);
@@ -2587,8 +2728,10 @@
 {
     int so, eo;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     so = *(textPtrs + es->SelBegLine) + es->SelBegCol;
     eo = *(textPtrs + es->SelEndLine) + es->SelEndCol;
@@ -2620,13 +2763,14 @@
 {
     int plen;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    char *text = EDIT_TextAddr(es, es->hText);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    char *text = EDIT_HeapAddr(hwnd, es->hText);
     
     plen = strlen(text) + len;
     if (plen + 1 > es->textlen)
     {
-	es->hText = EDIT_TextReAlloc(es, es->hText, es->textlen + len);
+	es->hText = EDIT_HeapReAlloc(hwnd, es->hText, es->textlen + len);
 	es->textlen = plen + 1;
     }
     memmove(CurrChar + len, CurrChar, strlen(CurrChar) + 1);
@@ -2639,7 +2783,7 @@
     EDIT_GetLineCol(hwnd, (int)((CurrChar + len) - text), &(es->CurrLine),
 		                                    &(es->CurrCol));
     es->WndRow = es->CurrLine - es->wtop;
-    es->WndCol = EDIT_StrLength(es, EDIT_TextLine(hwnd, es->CurrLine),
+    es->WndCol = EDIT_StrLength(hwnd, EDIT_TextLine(hwnd, es->CurrLine),
 				 es->CurrCol, 0) - es->wleft;
 }
 
@@ -2652,7 +2796,8 @@
 {
     int row, col;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (wParam == (WORD)-1)
 	return (LONG)(es->SelBegLine);
@@ -2670,8 +2815,10 @@
 LONG EDIT_LineIndexMsg(HWND hwnd, WORD wParam)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     if (wParam == (WORD)-1)
 	wParam = es->CurrLine;
@@ -2689,8 +2836,10 @@
     int row, col, len;
     int sbl, sbc, sel, sec;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    unsigned int *textPtrs = 
+	(unsigned int *)EDIT_HeapAddr(hwnd, es->hTextPtrs);
 
     if (wParam == (WORD)-1)
     {
@@ -2744,8 +2893,9 @@
     TEXTMETRIC tm;
     HFONT oldfont;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
-    short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths);
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
+    short *charWidths = (short *)EDIT_HeapAddr(hwnd, es->hCharWidths);
 
     es->hFont = wParam;
     hdc = GetDC(hwnd);
@@ -2757,7 +2907,7 @@
     ReleaseDC(hwnd, hdc);
 
     es->WndRow = (es->CurrLine - es->wtop) / es->txtht;
-    es->WndCol = EDIT_StrLength(es, EDIT_TextLine(hwnd, es->CurrLine),
+    es->WndCol = EDIT_StrLength(hwnd, EDIT_TextLine(hwnd, es->CurrLine),
 				 es->CurrCol, 0) - es->wleft;
 
     InvalidateRect(hwnd, NULL, TRUE);
@@ -2777,12 +2927,14 @@
 {
     char *text;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
-    es->hDeletedText = EDIT_HEAP_REALLOC(es->hDeletedText, len);
+    es->hDeletedText = GlobalReAlloc(es->hDeletedText, len, GMEM_MOVEABLE);
     if (!es->hDeletedText) return;
-    text = (char *)EDIT_HEAP_ADDR(es->hDeletedText);
+    text = (char *)GlobalLock(es->hDeletedText);
     memcpy(text, deltext, len);
+    GlobalUnlock(es->hDeletedText);
     es->DeletedLength = len;
     es->DeletedCurrLine = line;
     es->DeletedCurrCol = col;
@@ -2798,9 +2950,10 @@
 void EDIT_ClearDeletedText(HWND hwnd)
 {
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
-    EDIT_HEAP_FREE(es->hDeletedText);
+    GlobalFree(es->hDeletedText);
     es->hDeletedText = 0;
     es->DeletedLength = 0;
 }
@@ -2814,14 +2967,16 @@
 {
     char *text;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
     
     if (es->hDeletedText)
     {
-	text = (char *)EDIT_HEAP_ADDR(es->hDeletedText);
+	text = (char *)GlobalLock(es->hDeletedText);
 	es->CurrLine = es->DeletedCurrLine;
 	es->CurrCol = es->DeletedCurrCol;
 	EDIT_InsertText(hwnd, text, es->DeletedLength);
+	GlobalUnlock(es->hDeletedText);
 	EDIT_ClearDeletedText(hwnd);
 
 	es->SelBegLine = es->CurrLine;
@@ -2829,7 +2984,7 @@
 	EDIT_GetLineCol(hwnd, (int)((CurrChar + es->DeletedLength) - text), 
 			&(es->CurrLine), &(es->CurrCol));
 	es->WndRow = es->CurrLine - es->wtop;
-	es->WndCol = EDIT_StrLength(es, EDIT_TextLine(hwnd, es->CurrLine),
+	es->WndCol = EDIT_StrLength(hwnd, EDIT_TextLine(hwnd, es->CurrLine),
 				     es->CurrCol, 0) - es->wleft;
 	es->SelEndLine = es->CurrLine;
 	es->SelEndCol = es->CurrCol;
@@ -2844,46 +2999,84 @@
 
 
 /*********************************************************************
- *  EDIT_TextAlloc
+ *  EDIT_HeapAlloc
  *
- *  Allocate the text buffer.
+ *  Allocate the specified number of bytes on the specified local heap.
  */
 
-unsigned int EDIT_TextAlloc(EDITSTATE *es, int bytes)
+unsigned int EDIT_HeapAlloc(HWND hwnd, int bytes)
 {
-    return ((unsigned int)HEAP_Alloc(es->localheap, GMEM_MOVEABLE,
-				     bytes) & 0xffff);
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    return ((unsigned int)HEAP_Alloc((MDESC **)
+				     *(LONG *)(wndPtr->wExtra + 2), 
+				     GMEM_MOVEABLE, bytes) & 0xffff);
 }
 
 
 /*********************************************************************
- *  EDIT_TextAddr
+ *  EDIT_HeapAddr
  *
- *  Return the address of the text buffer.
+ *  Return the address of the memory pointed to by the handle.
  */
 
-void *EDIT_TextAddr(EDITSTATE *es, unsigned int handle)
+void *EDIT_HeapAddr(HWND hwnd, unsigned int handle)
 {
-    return ((void *)((handle) ? ((handle) | ((unsigned int)(*(es->localheap))
-					    & 0xffff0000)) : 0));
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    return ((void *)((handle) ? ((handle) | ((unsigned int)
+		    (*(MDESC **)*(LONG *)(wndPtr->wExtra + 2))   
+		     & 0xffff0000)) : 0));
 }
 
 
 /*********************************************************************
- *  EDIT_TextReAlloc
+ *  EDIT_HeapReAlloc
  *
- *  Reallocate the text buffer.
+ *  Reallocate the memory pointed to by the handle.
  */
 
-unsigned int EDIT_TextReAlloc(EDITSTATE *es, unsigned int handle, int bytes)
+unsigned int EDIT_HeapReAlloc(HWND hwnd, unsigned int handle, int bytes)
 {
-    return ((unsigned int)HEAP_ReAlloc(es->localheap, 
-				       EDIT_TextAddr(es, handle),
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    return ((unsigned int)HEAP_ReAlloc((MDESC **)
+				       *(LONG *)(wndPtr->wExtra + 2), 
+				       EDIT_HeapAddr(hwnd, handle),
 				       bytes, GMEM_MOVEABLE) & 0xffff);
 }
 
 
 /*********************************************************************
+ *  EDIT_HeapFree
+ *
+ *  Frees the memory pointed to by the handle.
+ */
+
+void EDIT_HeapFree(HWND hwnd, unsigned int handle)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    HEAP_Free((MDESC **)*(LONG *)(wndPtr->wExtra + 2), 
+	      EDIT_HeapAddr(hwnd, handle));
+}
+
+
+/*********************************************************************
+ *  EDIT_HeapSize
+ *
+ *  Return the size of the given object on the local heap.
+ */
+
+unsigned int EDIT_HeapSize(HWND hwnd, unsigned int handle)
+{
+    WND *wndPtr = WIN_FindWndPtr(hwnd);
+
+    return HEAP_LocalSize((MDESC **)*(LONG *)(wndPtr->wExtra + 2), handle);
+}
+
+
+/*********************************************************************
  *  EM_SETHANDLE message function
  */
 
@@ -2891,12 +3084,13 @@
 {
     MDESC *m;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     if (IsMultiLine())
     {
 	es->hText = wParam;
-	es->MaxTextLen = HEAP_LocalSize(es->localheap, es->hText);
+	es->MaxTextLen = EDIT_HeapSize(hwnd, es->hText);
 	es->wlines = 0;
 	es->wtop = es->wleft = 0;
 	es->CurrLine = es->CurrCol = 0;
@@ -2921,21 +3115,22 @@
 {
     unsigned short *tabstops;
     WND *wndPtr = WIN_FindWndPtr(hwnd);
-    EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra)));
+    EDITSTATE *es = 
+	(EDITSTATE *)EDIT_HeapAddr(hwnd, (HANDLE)(*(wndPtr->wExtra)));
 
     es->NumTabStops = wParam;
     if (wParam == 0)
-	es->hTabStops = EDIT_HEAP_REALLOC(es->hTabStops, 1);
+	es->hTabStops = EDIT_HeapReAlloc(hwnd, es->hTabStops, 1);
     else if (wParam == 1)
     {
-	es->hTabStops = EDIT_HEAP_REALLOC(es->hTabStops, 1);
-	tabstops = (unsigned short *)EDIT_HEAP_ADDR(es->hTabStops);
+	es->hTabStops = EDIT_HeapReAlloc(hwnd, es->hTabStops, 1);
+	tabstops = (unsigned short *)EDIT_HeapAddr(hwnd, es->hTabStops);
 	*tabstops = (unsigned short)lParam;
     }
     else
     {
-	es->hTabStops = EDIT_HEAP_REALLOC(es->hTabStops, wParam);
-	tabstops = (unsigned short *)EDIT_HEAP_ADDR(es->hTabStops);
+	es->hTabStops = EDIT_HeapReAlloc(hwnd, es->hTabStops, wParam);
+	tabstops = (unsigned short *)EDIT_HeapAddr(hwnd, es->hTabStops);
 	memcpy(tabstops, (unsigned short *)lParam, wParam);
     }
     return 0L;
diff --git a/controls/menu.c b/controls/menu.c
index 7b05747..5e3dee5 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -156,7 +156,7 @@
 									hwnd, lppop->Width, lppop->Height);
 #endif
 			SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height, 
-									SWP_NOZORDER | SWP_NOMOVE);
+									SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE );
 #ifdef DEBUG_MENU
 			printf("PopupMenuWndProc // End of WM_SHOWWINDOW !\n");
 #endif
@@ -1135,7 +1135,7 @@
 #endif
 	hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
 	lppop->CheckWidth = 0;
-	LineHeight = OldHeight = SYSMETRICS_CYMENU + 2;
+	LineHeight = OldHeight = SYSMETRICS_CYMENU + 1;
 	SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + LineHeight);
 	lpitem2 = lppop->firstItem;
 	while (lpitem != NULL) {
@@ -1202,6 +1202,29 @@
 
 
 /***********************************************************************
+ *           MENU_GetMenuBarHeight
+ *
+ * Compute the size of the menu bar height. Used by NC_HandleNCCalcSize().
+ */
+WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth )
+{
+    HDC hdc;
+    RECT rectBar;
+    WND *wndPtr;
+    LPPOPUPMENU lppop;
+
+    if (!(lppop = PopupMenuGetWindowAndStorage( hwnd, &wndPtr ))) return 0;
+    if (!wndPtr) return 0;
+    hdc = GetDC( hwnd );
+    SetRect( &rectBar, 0, 0, menubarWidth, SYSMETRICS_CYMENU );
+    MenuBarCalcSize( hdc, &rectBar, lppop );
+    ReleaseDC( hwnd, hdc );
+    printf( "MENU_GetMenuBarHeight: returning %d\n", lppop->Height );
+    return lppop->Height;
+}
+
+
+/***********************************************************************
  *           FindMenuItem
  */
 LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags)
@@ -1844,7 +1867,7 @@
 			}
 		}
 	else {
-		ShowWindow(lppop->hWnd, SW_SHOW);
+		ShowWindow(lppop->hWnd, SW_SHOWNOACTIVATE);
 		}
 	if (!lppop->BarFlag) {
 		PopupMenuCalcSize(lppop->hWnd);
@@ -1853,7 +1876,7 @@
 			x, y, lppop->Width, lppop->Height); 
 #endif
 		SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, 
-			SWP_NOZORDER);
+			SWP_NOACTIVATE | SWP_NOZORDER);
 		}
 	SetFocus(lppop->hWnd);
 	if (!MenuHasFocus) {
@@ -2208,7 +2231,7 @@
 #endif
 	if (GetCapture() == hWnd) ReleaseCapture();
 	if (wndPtr->window != 0) {
-		flags = SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED;
+		flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED;
 /*		if (!IsWindowVisible(hWnd)) flags |= SWP_NOREDRAW; */
 		flags |= SWP_NOREDRAW;
 		if (hMenu == 0) {
diff --git a/controls/widgets.c b/controls/widgets.c
index 356c606..204b65f 100644
--- a/controls/widgets.c
+++ b/controls/widgets.c
@@ -34,9 +34,9 @@
       0, 0, 0, 0, NULL, "LISTBOX" },
     { CS_GLOBALCLASS, (LONG(*)())ComboBoxWndProc, 0, 8,
       0, 0, 0, 0, NULL, "COMBOBOX" },
-    { CS_GLOBALCLASS, (LONG(*)())EditWndProc, 0, 2, 
+    { CS_GLOBALCLASS, (LONG(*)())EditWndProc, 0, 4, 
       0, 0, 0, 0, NULL, "EDIT" },
-    { CS_GLOBALCLASS, (LONG(*)())PopupMenuWndProc, 0, 8,
+    { CS_GLOBALCLASS | CS_SAVEBITS, (LONG(*)())PopupMenuWndProc, 0, 8,
       0, 0, 0, 0, NULL, "POPUPMENU" },
     { CS_GLOBALCLASS, (LONG(*)())DesktopWndProc, 0, sizeof(DESKTOPINFO),
       0, 0, 0, 0, NULL, DESKTOP_CLASS_NAME },
diff --git a/if1632/Imakefile b/if1632/Imakefile
index 601424d..f686a92 100644
--- a/if1632/Imakefile
+++ b/if1632/Imakefile
@@ -3,10 +3,16 @@
 
 MODULE = if1632
 
+#ifdef WINELIB
+SRCS = \
+	callback.c \
+	relay.c
+#else
 SRCS = \
 	call.S \
 	callback.c \
 	relay.c
+#endif
 
 DLLOBJS = \
 	dll_gdi.o \
@@ -23,6 +29,10 @@
 	dll_win87em.o \
 	dll_winsock.o
 
+#ifdef WINELIB
+DLLOBJS=
+#endif
+
 OBJS1= $(SRCS:.S=.o)
 
 #ifndef NewBuild
diff --git a/if1632/callback.c b/if1632/callback.c
index 676fc7e..3d9fefc 100644
--- a/if1632/callback.c
+++ b/if1632/callback.c
@@ -1,3 +1,4 @@
+#ifndef WINELIB
 static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $";
 static char Copyright[] = "Copyright  Robert J. Amstadt, 1993";
 
@@ -324,3 +325,4 @@
 #endif
 	longjmp (sb -> buffer, val);
 }
+#endif /* !WINELIB */
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index bc4a231..b39fef7 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -273,7 +273,7 @@
 	   CreateRoundRectRgn(1 2 3 4 5 6)
 445 pascal CreateDIBPatternBrush(word word) CreateDIBPatternBrush(1 2)
 #449 pascal DEVICECOLORMATCH
-#450 pascal POLYPOLYGON
+450 pascal PolyPolygon(word ptr ptr word) PolyPolygon(1 2 3 4)
 451 pascal CreatePolyPolygonRgn(ptr ptr word word)
 	   CreatePolyPolygonRgn(1 2 3 4)
 #452 pascal GDISEEGDIDO
diff --git a/if1632/relay.c b/if1632/relay.c
index bfd7fcb..9de7655 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -24,24 +24,31 @@
 
 #define DEBUG_RELAY /* */
 
+#ifdef WINELIB
+#define WineLibSkip(x) 0
+#else
+#define WineLibSkip(x) x
+#endif
+
 struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS] =
 {
-    { "KERNEL",  KERNEL_table, 	410, 1 },
-    { "USER",    USER_table, 	540, 2 },
-    { "GDI",     GDI_table, 	490, 3 },
-    { "UNIXLIB", UNIXLIB_table,  10, 4 },
-    { "WIN87EM", WIN87EM_table,  10, 5 },
-    { "SHELL",   SHELL_table,   256, 6 },
-    { "SOUND",   SOUND_table,    20, 7 },
-    { "KEYBOARD",KEYBOARD_table,137, 8 },
-    { "WINSOCK", WINSOCK_table, 155, 9 },
-    { "STRESS",  STRESS_table,   15, 10},
-    { "MMSYSTEM",MMSYSTEM_table,1226,11},
-    { "SYSTEM",  SYSTEM_table,   20 ,12},
-    { "TOOLHELP",TOOLHELP_table, 83, 13},
+    { "KERNEL",  WineLibSkip(KERNEL_table), 	410, 1 },
+    { "USER",    WineLibSkip(USER_table), 	540, 2 },
+    { "GDI",     WineLibSkip(GDI_table), 	490, 3 },
+    { "UNIXLIB", WineLibSkip(UNIXLIB_table),  10, 4 },
+    { "WIN87EM", WineLibSkip(WIN87EM_table),  10, 5 },
+    { "SHELL",   WineLibSkip(SHELL_table),   103, 6 },
+    { "SOUND",   WineLibSkip(SOUND_table),    20, 7 },
+    { "KEYBOARD",WineLibSkip(KEYBOARD_table),137, 8 },
+    { "WINSOCK", WineLibSkip(WINSOCK_table), 155, 9 },
+    { "STRESS",  WineLibSkip(STRESS_table),   15, 10},
+    { "MMSYSTEM",WineLibSkip(MMSYSTEM_table),1226,11},
+    { "SYSTEM",  WineLibSkip(SYSTEM_table),   20 ,12},
+    { "TOOLHELP",WineLibSkip(TOOLHELP_table), 83, 13},
 };
 /* don't forget to increase N_BUILTINS in dll.h if you add a dll */
 
+#ifndef WINELIB
 unsigned short *Stack16Frame;
 
 extern unsigned long  IF1632_Saved16_esp;
@@ -211,6 +218,7 @@
     Stack16Frame = saved_Stack16Frame;
     return ret_val;
 }
+#endif
 
 /**********************************************************************
  *					FindDLLTable
@@ -222,8 +230,11 @@
 
     for (i = 0; i < N_BUILTINS; i++)
 	if (strcasecmp(dll_builtin_table[i].dll_name, dll_name) == 0)
+#ifdef WINELIB
+	    return dll_builtin_table[i].dll_number;
+#else
 	    return dll_builtin_table[i].dll_table;
-    
+#endif
     return NULL;
 }
 
@@ -258,6 +269,7 @@
     return arg;
 }
 
+#ifndef WINELIB
 #ifdef WINESTAT
 void winestat(){
 	int i, j;
@@ -294,3 +306,4 @@
 	printf("TOTAL: %d of %d implemented (%3.1f %%)\n",timplemented, tused, perc);
 }
 #endif /* WINESTAT */
+#endif /* !WINELIB */
diff --git a/if1632/system.spec b/if1632/system.spec
index b37eb9f..e54f67f 100644
--- a/if1632/system.spec
+++ b/if1632/system.spec
@@ -1,3 +1,5 @@
 name	system
 id	12
 length	20
+
+6 pascal GetSystemmsecCount() GetTickCount()
diff --git a/if1632/toolhelp.spec b/if1632/toolhelp.spec
index fe1e180..682dec5 100644
--- a/if1632/toolhelp.spec
+++ b/if1632/toolhelp.spec
@@ -11,10 +11,10 @@
 # 56   1  090e  LOCALINFO exported, shared data
 # 57   1  095e  LOCALFIRST exported, shared data
 # 58   1  09e9  LOCALNEXT exported, shared data
-#59 pascal ModuleFirst(ptr) ModuleFirst(1)
-#60 pascal ModuleNext(ptr) ModuleNext(1)
-#61 pascal ModuleFindName(ptr ptr) ModuleFindName(1 2)
-#62 pascal ModuleFindHandle(ptr word) ModuleFindHandle(1 2)
+59 pascal ModuleFirst(ptr) ModuleFirst(1)
+60 pascal ModuleNext(ptr) ModuleNext(1)
+61 pascal ModuleFindName(ptr ptr) ModuleFindName(1 2)
+62 pascal ModuleFindHandle(ptr word) ModuleFindHandle(1 2)
 # 63   1  0caa  TASKFIRST exported, shared data
 # 64   1  0ced  TASKNEXT exported, shared data
 # 65   1  0d2e  TASKFINDHANDLE exported, shared data
diff --git a/if1632/user.spec b/if1632/user.spec
index 2023ed5..edb86b9 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -291,6 +291,7 @@
 278 pascal GetDeskTopHwnd() GetDesktopWindow()
 #279 OLDSETDESKPATTERN
 #280 SETSYSTEMMENU
+281 pascal GetSysColorBrush(word) GetSysColorBrush(1)
 282 pascal SelectPalette(word word word) SelectPalette(1 2 3)
 283 pascal RealizePalette(word) RealizePalette(1)
 284 pascal GetFreeSystemResources(word) GetFreeSystemResources(1)
diff --git a/include/desktop.h b/include/desktop.h
index 38b7868..e7667a2 100644
--- a/include/desktop.h
+++ b/include/desktop.h
@@ -13,6 +13,8 @@
 {
     HBRUSH   hbrushPattern;
     HBITMAP  hbitmapWallPaper;
+    SIZE     bitmapSize;
+    BOOL     fTileWallPaper;
 } DESKTOPINFO;
 
 extern BOOL DESKTOP_SetPattern(char *pattern );
diff --git a/include/windows.h b/include/windows.h
index c389455..3f14d8b 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1038,6 +1038,15 @@
 typedef struct { BYTE rgbBlue, rgbGreen, rgbRed, rgbReserved; } RGBQUAD;
 typedef struct { BYTE rgbtBlue, rgbtGreen, rgbtRed; } RGBTRIPLE;
 
+typedef struct
+{
+    UINT    bfType;
+    DWORD   bfSize WINE_PACKED;
+    UINT    bfReserved1 WINE_PACKED;
+    UINT    bfReserved2 WINE_PACKED;
+    DWORD   bfOffBits WINE_PACKED;
+} BITMAPFILEHEADER;
+
 typedef struct tagBITMAPINFOHEADER
 {
     DWORD 	biSize;
@@ -2899,7 +2908,7 @@
 Fd(BOOL,GetCharWidth,HDC,a,WORD,b,WORD,c,LPINT,d)
 Fd(BOOL,HiliteMenuItem,HWND,a,HMENU,b,WORD,c,WORD,d)
 Fd(BOOL,MoveToEx,HDC,a,short,b,short,c,LPPOINT,d)
-Fd(BOOL,PolyPolygon,HDC,a,LPPOINT,b,LPINT,c,int,d)
+Fd(BOOL,PolyPolygon,HDC,a,LPPOINT,b,LPINT,c,WORD,d)
 Fd(BOOL,PostAppMessage,HANDLE,a,WORD,b,WORD,c,LONG,d)
 Fd(BOOL,RedrawWindow,HWND,a,LPRECT,b,HRGN,c,UINT,d)
 Fd(BOOL,SetBitmapDimensionEx,HBITMAP,a,short,b,short,c,LPSIZE,d)
@@ -3022,4 +3031,7 @@
 Fm(int,StretchDIBits,HDC,a,WORD,b,WORD,c,WORD,d,WORD,e,WORD,f,WORD,g,WORD,h,WORD,i,LPSTR,j,LPBITMAPINFO,k,WORD,l,DWORD,m)
 Fn(HFONT,CreateFont,int,a,int,b,int,c,int,d,int,e,BYTE,f,BYTE,g,BYTE,h,BYTE,i,BYTE,j,BYTE,k,BYTE,l,BYTE,m,LPSTR,n)
 
+#ifdef WINELIB
+#define WINELIB_UNIMP(x) fprintf (stderr, "WineLib: Unimplemented %s\n", x)
+#endif
 #endif  /* WINDOWS_H */
diff --git a/loader/ldtlib.c b/loader/ldtlib.c
index c264979..40929d6 100644
--- a/loader/ldtlib.c
+++ b/loader/ldtlib.c
@@ -64,6 +64,9 @@
     ldt_info.contents       = contents;
     ldt_info.read_exec_only = read_only_flag;
     ldt_info.limit_in_pages = limit_in_pages_flag;
+#ifdef NEW_LDT_STRUCT
+    ldt_info.seg_not_present = 0;
+#endif
 
     return modify_ldt(1, &ldt_info, sizeof(ldt_info));
 #endif
diff --git a/loader/library.c b/loader/library.c
index 8253cb5..2ceb59d 100644
--- a/loader/library.c
+++ b/loader/library.c
@@ -212,6 +212,9 @@
  */
 FARPROC GetProcAddress(HANDLE hModule, char *proc_name)
 {
+#ifdef WINELIB
+    WINELIB_UNIMP ("GetProcAddress");
+#else
     int		i, sel, addr, ret;
     register struct w_files *w = wine_files;
     int 	ordinal, len;
@@ -312,6 +315,7 @@
     sel = (ret >> 16);
     printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr);
     return (FARPROC) ret;
+#endif /* WINELIB */
 }
 
 /* internal dlls */
diff --git a/loader/main.c b/loader/main.c
index 459e7bc..c1991d0 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -358,7 +358,7 @@
 		rv = CallTo16(cs_reg << 16 | ip_reg, ds_reg);
 		printf ("rv = %x\n", rv);
 	    } else
-		printf("%s skipped\n");
+		printf("%s skipped\n", wpnt->name);
 	}
 }
 
@@ -399,4 +399,9 @@
     for( ; wpnt != final_wpnt; wpnt = wpnt->next)
 	InitDLL(wpnt);
 }
+#else /* #ifndef WINELIB */
+void InitDLL(struct w_files *wpnt)
+{
+}
+
 #endif /* #ifndef WINELIB */
diff --git a/loader/ne_image.c b/loader/ne_image.c
index 98b3059..4247e6a 100644
--- a/loader/ne_image.c
+++ b/loader/ne_image.c
@@ -51,6 +51,7 @@
 	myerror("Unable to read NE header from file");
     }
 }
+#endif
 
 /**********************************************************************
  *			LoadNEImage
@@ -68,6 +69,7 @@
     status = lseek(wpnt->fd, wpnt->mz_header->ne_offset, SEEK_SET);
     load_ne_header (wpnt->fd, wpnt->ne_header);
 
+#ifndef WINELIB
     /*
      * Create segment selectors.
      */
@@ -83,7 +85,7 @@
     wpnt->hinstance = (wpnt->
 		       selector_table[wpnt->ne_header->auto_data_seg-1].
 		       selector);
-
+#endif
     /* Get the lookup  table.  This is used for looking up the addresses
        of functions that are exported */
 
@@ -131,6 +133,7 @@
       if (strcasecmp(buff, wpnt->name) != 0 )
 	LoadImage(buff, DLL, 0);
     }
+#ifndef WINELIB
     /* fixup references */
 
     for (segment = 0; segment < wpnt->ne_header->n_segment_tab; segment++)
@@ -139,7 +142,7 @@
 
     FixupFunctionPrologs(wpnt);
     InitializeLoadedDLLs(wpnt);
-
+#endif
     return(wpnt->hinstance);
 }
 
@@ -197,6 +200,7 @@
 }
 
 
+#ifndef WINELIB
 /**********************************************************************
  *					FixupSegment
  */
@@ -458,4 +462,4 @@
     return 0;
 }
 
-#endif
+#endif /* !WINELIB */
diff --git a/loader/resource.c b/loader/resource.c
index 7814e66..4211704 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -948,6 +948,7 @@
 	    GlobalFree(r->info_mem);
 	    return 0;
 	}
+	rp = r;
     }
     
     return hResData;
diff --git a/loader/signal.c b/loader/signal.c
index 861c04e..c0c52fb 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -90,8 +90,15 @@
 
 	/* First take care of a few preliminaries */
 #ifdef linux
-    if(signal != SIGSEGV && signal != SIGTRAP) 
+    if(signal != SIGSEGV 
+       && signal != SIGILL 
+#ifdef SIGBUS
+       && signal != SIGBUS 
+#endif
+       && signal != SIGTRAP) 
+    {
 	exit(1);
+    }
 
     /* And back up over the int3 instruction. */
     if(signal == SIGTRAP) {
@@ -151,6 +158,14 @@
 	    scp->sc_eip++;
             break;
 
+      case 0xfa: /* cli, ignored */
+	    scp->sc_eip++;
+            break;
+
+      case 0xfb: /* sti, ignored */
+	    scp->sc_eip++;
+            break;
+
       default:
 		fprintf(stderr, "Unexpected Windows program segfault"
 			" - opcode = %x\n", *instr);
@@ -191,6 +206,10 @@
 	segv_act.sa_restorer = 
 		(void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
 	wine_sigaction(SIGSEGV, &segv_act, NULL);
+	wine_sigaction(SIGILL, &segv_act, NULL);
+#ifdef SIGBUS
+	wine_sigaction(SIGBUS, &segv_act, NULL);
+#endif
 	wine_sigaction(SIGTRAP, &segv_act, NULL); /* For breakpoints */
 #endif
 #if defined(__NetBSD__) || defined(__FreeBSD__)
diff --git a/misc/audio.c b/misc/audio.c
index 153223f..dcdee0d 100644
--- a/misc/audio.c
+++ b/misc/audio.c
@@ -3,7 +3,7 @@
  *
  * Copyright 1994 Martin Ayotte
  */
-
+#ifndef WINELIB
 #define DEBUG_MCIWAVE
 
 static char Copyright[] = "Copyright  Martin Ayotte, 1994";
@@ -1507,3 +1507,4 @@
 }
 
 
+#endif /* !WINELIB */
diff --git a/misc/main.c b/misc/main.c
index 4e94a7a..4479cdc 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -287,16 +287,10 @@
 			 StructureNotifyMask;
     win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow );
 
-    if (Options.nobackingstore)
-       win_attr.backing_store = NotUseful;
-    else
-       win_attr.backing_store = Always;
-
     rootWindow = XCreateWindow( display, DefaultRootWindow(display),
 			        desktopX, desktopY, width, height, 0,
 			        CopyFromParent, InputOutput, CopyFromParent,
-			        CWEventMask | CWCursor |
-			        CWBackingStore, &win_attr );
+			        CWEventMask | CWCursor, &win_attr );
 
       /* Set window manager properties */
 
diff --git a/misc/mcicda.c b/misc/mcicda.c
index 55497be..3b49cde 100644
--- a/misc/mcicda.c
+++ b/misc/mcicda.c
@@ -3,7 +3,7 @@
  *
  * Copyright 1994 Martin Ayotte
  */
-
+#ifndef WINELIB
 static char Copyright[] = "Copyright  Martin Ayotte, 1994";
 
 /*
@@ -857,3 +857,4 @@
 
 /*-----------------------------------------------------------------------*/
 
+#endif
diff --git a/misc/mmaux.c b/misc/mmaux.c
index 64627d8..58bc85d 100644
--- a/misc/mmaux.c
+++ b/misc/mmaux.c
@@ -3,7 +3,7 @@
  *
  * Copyright 1994 Martin Ayotte
  */
-
+#ifndef WINELIB
 static char Copyright[] = "Copyright  Martin Ayotte, 1994";
 
 #include "stdio.h"
@@ -114,3 +114,4 @@
 }
 
 
+#endif /* !WINELIB */
diff --git a/misc/mmsystem.c b/misc/mmsystem.c
index da5ad6f..0e1eb91 100644
--- a/misc/mmsystem.c
+++ b/misc/mmsystem.c
@@ -3,7 +3,7 @@
  *
  * Copyright 1993 Martin Ayotte
  */
-
+#ifndef WINELIB
 static char Copyright[] = "Copyright  Martin Ayotte, 1993";
 
 #include "stdio.h"
@@ -614,9 +614,14 @@
 		printf("MCI_OPEN // wDeviceID=%04X !\n", lpParms->wDeviceID);
 		switch(dwDevTyp) {
 			case MCI_DEVTYPE_CD_AUDIO:
-				return CDAUDIO_DriverProc(0, 0, MCI_OPEN_DRIVER, 
+#ifdef WINELIB
+		    WINELIB_UNIMP ("CDAUDIO_DriverProc");
+#else
+				return CDAUDIO_DriverProc(0, 0, MCI_OPEN_DRIVER,
+
 									dwParam, (DWORD)lpParms);
-			case MCI_DEVTYPE_WAVEFORM_AUDIO:
+#endif
+		case MCI_DEVTYPE_WAVEFORM_AUDIO:
 				return WAVE_DriverProc(0, 0, MCI_OPEN_DRIVER, 
 									dwParam, (DWORD)lpParms);
 			case MCI_DEVTYPE_SEQUENCER:
@@ -646,8 +651,10 @@
 	printf("mciClose(%u, %08X, %08X)\n", wDevID, dwParam, lpParms);
 	switch(mciDrv[wDevID].wType) {
 		case MCI_DEVTYPE_CD_AUDIO:
+#ifndef WINELIB
 			dwRet = CDAUDIO_DriverProc(mciDrv[wDevID].wDeviceID, 0, 
 						MCI_CLOSE, dwParam, (DWORD)lpParms);
+#endif
 			break;
 		case MCI_DEVTYPE_WAVEFORM_AUDIO:
 			dwRet = WAVE_DriverProc(mciDrv[wDevID].wDeviceID, 0, 
@@ -692,8 +699,11 @@
 		default:
 			switch(mciDrv[wDevID].wType) {
 				case MCI_DEVTYPE_CD_AUDIO:
+#ifndef WINELIB
 					return CDAUDIO_DriverProc(mciDrv[wDevID].wDeviceID, hDrv, 
 											wMsg, dwParam1, dwParam2);
+#endif
+					
 				case MCI_DEVTYPE_WAVEFORM_AUDIO:
 					return WAVE_DriverProc(mciDrv[wDevID].wDeviceID, hDrv, 
 											wMsg, dwParam1, dwParam2);
@@ -1984,7 +1994,9 @@
 	DWORD 	dwDevID = 0;
 	printf("DrvSendMessage(%04X, %04X, %08X, %08X);\n",
 					hDriver, msg, lParam1, lParam2);
+#ifndef WINELIB
 	return CDAUDIO_DriverProc(dwDevID, hDriver, msg, lParam1, lParam2);
+#endif
 }
 
 /**************************************************************************
@@ -2007,3 +2019,4 @@
 
 
 
+#endif
diff --git a/objects/brush.c b/objects/brush.c
index a12c455..3979836 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -143,6 +143,13 @@
     return retval;
 }
 
+/***********************************************************************
+ *           GetSysColorBrush    (USER.281)
+ */
+WORD GetSysColorBrush(WORD x)
+{
+	return GetStockObject(GRAY_BRUSH);
+}
 
 /***********************************************************************
  *           BRUSH_DeleteObject
diff --git a/objects/text.c b/objects/text.c
index 53c5bb0..0cb0686 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -74,7 +74,7 @@
 	case PREFIX:
 	    if (!(format & DT_NOPREFIX))
 	    {
-		prefix_offset = j + 1;
+		prefix_offset = j;
 		i++;
 	    }
 	    else
@@ -177,7 +177,7 @@
     SIZE size;
     char *strPtr;
     static char line[1024];
-    int len, lh, prefix_x, prefix_len;
+    int len, lh, prefix_x, prefix_end;
     TEXTMETRIC tm;
     int x = rect->left, y = rect->top;
     int width = rect->right - rect->left;
@@ -214,10 +214,10 @@
 
 	if (prefix_offset != -1)
 	{
-	    GetTextExtentPoint(hdc, line, prefix_offset - 1, &size);
+	    GetTextExtentPoint(hdc, line, prefix_offset, &size);
 	    prefix_x = size.cx;
-	    GetTextExtentPoint(hdc, line + prefix_offset, 1, &size);
-	    prefix_len = size.cx;
+	    GetTextExtentPoint(hdc, line, prefix_offset + 1, &size);
+	    prefix_end = size.cx - 1;
 	}
 
 	if (!GetTextExtentPoint(hdc, line, len, &size)) return 0;
@@ -235,8 +235,8 @@
 	    if (!TextOut(hdc, x, y, line, len)) return 0;
 	if (prefix_offset != -1)
 	{
-	    MoveTo(hdc, x + prefix_x, y + size.cy);
-	    LineTo(hdc, x + prefix_x + prefix_len, y + size.cy);
+	    MoveTo(hdc, x + prefix_x, y + tm.tmAscent + 1 );
+	    LineTo(hdc, x + prefix_end, y + tm.tmAscent + 1 );
 	}
 
 	if (strPtr)
diff --git a/toolkit/heap.c b/toolkit/heap.c
index 002257f..cc4e2d7 100644
--- a/toolkit/heap.c
+++ b/toolkit/heap.c
@@ -121,7 +121,7 @@
 #ifdef DEBUG_HEAP
     printf (">%d->%p\n", hMem, *m);
 #endif
-    return *m;
+    return m ? *m : 0;
 }
 
 HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
@@ -196,6 +196,16 @@
     return GlobalUnlock (hMem);
 }
 
+int HEAP_LocalSize ()
+{
+    return 0;
+}
+
+int HEAP_LocalFindHeap ()
+{
+    return 0;
+}
+
 #ifdef UNIMPLEMENTED
 void *GlobalQuickAlloc(int size)
 {
diff --git a/toolkit/winmain.c b/toolkit/winmain.c
index 3f68eb7..aa21d5e 100644
--- a/toolkit/winmain.c
+++ b/toolkit/winmain.c
@@ -8,6 +8,7 @@
 {
     int ret_val;
     char filename [4096];
+    HANDLE hTaskMain;
     
     GetPrivateProfileString("wine", "SystemResources", "sysres.dll", 
 			    filename, sizeof(filename), WINE_INI);
@@ -18,6 +19,7 @@
 	printf("System Resources Loaded // hSysRes='%04X'\n", hSysRes);
 
     USER_InitApp (hSysRes);
+    hTaskMain = CreateNewTask (1); /* This is not correct */
     ret_val = WinMain (1,		/* hInstance */
 		       0,		/* hPrevInstance */
 		       "",		/* lpszCmdParam */
diff --git a/windows/defwnd.c b/windows/defwnd.c
index e91e3a8..8ae88a0 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -22,6 +22,7 @@
 extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam );
 extern LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt );
 extern LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam );
+extern LONG WINPOS_HandleWindowPosChanging( WINDOWPOS *winpos ); /* winpos.c */
 extern void NC_TrackSysMenu( HWND hwnd ); /* menu.c */
 extern BOOL ActivateMenuBarFocus(HWND hWnd); /* menu.c */
 
@@ -126,6 +127,9 @@
 	if (wParam) SetFocus( hwnd );
 	break;
 
+    case WM_WINDOWPOSCHANGING:
+	return WINPOS_HandleWindowPosChanging( (WINDOWPOS *)lParam );
+
     case WM_WINDOWPOSCHANGED:
 	{
 	    WINDOWPOS * winPos = (WINDOWPOS *)lParam;
diff --git a/windows/graphics.c b/windows/graphics.c
index c21eff3..089e3cc 100644
--- a/windows/graphics.c
+++ b/windows/graphics.c
@@ -105,8 +105,8 @@
 BOOL GRAPH_DrawArc( HDC hdc, int left, int top, int right, int bottom,
 		    int xstart, int ystart, int xend, int yend, int lines )
 {
-    int xcenter, ycenter;
-    double start_angle, end_angle, diff_angle;
+    int xcenter, ycenter, istart_angle, idiff_angle;
+    double start_angle, end_angle;
     XPoint points[3];
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) 
@@ -151,16 +151,15 @@
 			 (double)(xstart-xcenter)*(bottom-top) );
     end_angle   = atan2( (double)(ycenter-yend)*(right-left),
 			 (double)(xend-xcenter)*(bottom-top) );
-    diff_angle  = end_angle - start_angle;
-    if (diff_angle < 0.0) diff_angle += 2*PI;
+    istart_angle = (int)(start_angle * 180 * 64 / PI);
+    idiff_angle  = (int)((end_angle - start_angle) * 180 * 64 / PI );
+    if (idiff_angle <= 0) idiff_angle += 360 * 64;
     if (left > right) swap_int( &left, &right );
     if (top > bottom) swap_int( &top, &bottom );
 
     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),
-	      (int)(diff_angle * 180 * 64 / PI) );
+	      right-left-1, bottom-top-1, istart_angle, idiff_angle );
     if (!lines) return TRUE;
 
     points[0].x = dc->w.DCOrgX + xcenter + (int)(cos(start_angle) * (right-left) / 2);
@@ -656,7 +655,7 @@
 {
     register int i;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
-    XPoint *points = (XPoint *) malloc (sizeof (XPoint) * count+1);
+    XPoint *points = (XPoint *) malloc (sizeof (XPoint) * (count+1));
 
     if (!dc) 
     {
@@ -666,29 +665,78 @@
 	return TRUE;
     }
 
-    if (DC_SetupGCForBrush( dc ))
+    for (i = 0; i < count; i++)
     {
-    		
-	for (i = 0; i < count; i++)
-	{
-	    points [i].x = dc->w.DCOrgX + XLPTODP(dc, pt [i].x);
-	    points [i].y = dc->w.DCOrgY + YLPTODP(dc, pt [i].y);
-	}
-	points [count] = points [0];
-		
-	XFillPolygon( display, dc->u.x.drawable, dc->u.x.gc,
-		     points, count, Complex, CoordModeOrigin);
-		
-	if (DC_SetupGCForPen ( dc ))
-	{
-	    XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
-		       points, count, CoordModeOrigin );
-	}
+	points[i].x = dc->w.DCOrgX + XLPTODP( dc, pt[i].x );
+	points[i].y = dc->w.DCOrgY + YLPTODP( dc, pt[i].y );
     }
-    free ((void *) points);
-    return (TRUE);
+    points[count] = points[0];
+
+    if (DC_SetupGCForBrush( dc ))
+	XFillPolygon( display, dc->u.x.drawable, dc->u.x.gc,
+		     points, count+1, Complex, CoordModeOrigin);
+
+    if (DC_SetupGCForPen ( dc ))
+	XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
+		   points, count+1, CoordModeOrigin );
+
+    free( points );
+    return TRUE;
 }
 
+
+/**********************************************************************
+ *          PolyPolygon  (GDI.450)
+ */
+BOOL PolyPolygon( HDC hdc, LPPOINT pt, LPINT counts, WORD polygons )
+{
+    int i;
+    HRGN hrgn;
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+
+    if (!dc) 
+    {
+	dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
+	if (!dc) return FALSE;
+	/* MF_MetaPoly(dc, META_POLYGON, pt, count); */
+	return TRUE;
+    }
+      /* The points should be converted to device coords before */
+      /* creating the region. But as CreatePolyPolygonRgn is not */
+      /* really correct either, it doesn't matter much... */
+      /* At least the outline will be correct :-) */
+    hrgn = CreatePolyPolygonRgn( pt, counts, polygons, dc->w.polyFillMode );
+    PaintRgn( hdc, hrgn );
+    DeleteObject( hrgn );
+
+      /* Draw the outline of the polygons */
+
+    if (DC_SetupGCForPen ( dc ))
+    {
+	int i, j, max = 0;
+	XPoint *points;
+
+	for (i = 0; i < polygons; i++) if (counts[i] > max) max = counts[i];
+	points = (XPoint *) malloc( sizeof(XPoint) * (max+1) );
+
+	for (i = 0; i < polygons; i++)
+	{
+	    for (j = 0; j < counts[i]; j++)
+	    {
+		points[j].x = dc->w.DCOrgX + XLPTODP( dc, pt->x );
+		points[j].y = dc->w.DCOrgY + YLPTODP( dc, pt->y );
+		pt++;
+	    }
+	    points[j] = points[0];
+	    XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
+		        points, j + 1, CoordModeOrigin );
+	}
+	free( points );
+    }
+    return TRUE;
+}
+
+
 /**********************************************************************
  *          FloodFill_rec -- FloodFill helper function
  *
diff --git a/windows/icon.c b/windows/icon.c
index dc9648e..ba7d94d 100644
--- a/windows/icon.c
+++ b/windows/icon.c
@@ -26,8 +26,8 @@
 	WND *parwPtr;
 	
 #ifdef DEBUG_ICON
-#endif
 	printf("ICON_Iconify %d\n", hwnd);
+#endif
 
 	parwPtr = WIN_FindWndPtr(wndPtr->hwndParent);
 	if (parwPtr == NULL) {
@@ -40,8 +40,10 @@
 		printf("argh, couldn't find icon\n");
 		exit(1);
 	}
+#ifdef DEBUG_ICON
 	printf("parent edge values are %d, %d\n",  parwPtr->rectWindow.left,
 				parwPtr->rectWindow.bottom);
+#endif
 	wndPtr->ptIconPos.x = parwPtr->rectWindow.left + 10;
 	wndPtr->ptIconPos.y = parwPtr->rectWindow.bottom - 80;
 
@@ -68,7 +70,9 @@
 	XMapWindow(display, wndPtr->icon);
 
 	SendMessage(hwnd, WM_PAINTICON, 0, 0);
+#ifdef DEBUG_ICON
         printf("done with iconify\n");
+#endif
 }
 
 
@@ -94,7 +98,7 @@
       		iconWidth = 64;
       		iconHeight = 64;
     	}	
-#define DEBUG_ICON 1
+
 #ifdef DEBUG_ICON
         printf("icon x,y is %d,%d\n",
 		wndPtr->ptIconPos.x, wndPtr->ptIconPos.y);
@@ -124,7 +128,9 @@
             (wndPtr->dwStyle & WS_VISIBLE) &&
             !(wndPtr->dwExStyle & WS_EX_TRANSPARENT))
         {
+#ifdef DEBUG_ICON
 		printf("got a winner!\n");
+#endif
 		return 1;
         } 
  
@@ -142,10 +148,14 @@
 
         	if ( !(wndPtr=WIN_FindWndPtr(hwnd)))  return 0;
       		if (ICON_isAtPoint(hwnd, pt))  {
+#ifdef DEBUG_ICON
 			printf("returning\n");
+#endif
 			return hwndRet = hwnd;
 		} else {
+#ifdef DEBUG_ICON
 			printf("checking child\n");
+#endif
       			hwnd = wndPtr->hwndChild;
 		}
     	}
@@ -157,7 +167,9 @@
 {
 	WND *wndPtr = WIN_FindWndPtr( hwnd );
 
+#ifdef DEBUG_ICON
 	printf("deiconifying\n");
+#endif
 	XUnmapWindow(display, wndPtr->icon); 
 	wndPtr->dwStyle &= ~WS_MINIMIZE;
 /*	wndPtr->rectNormal = myrect;
diff --git a/windows/nonclient.c b/windows/nonclient.c
index f799826..edc5ac2 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -27,6 +27,7 @@
 extern void WINPOS_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
 			    POINT *minTrack, POINT *maxTrack );  /* winpos.c */
 extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor );   /* cursor.c */
+extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth ); /* menu.c */
 
 
   /* Some useful macros */
@@ -117,13 +118,17 @@
 
     if (!wndPtr) return 0;
 
-    NC_AdjustRect( &tmpRect, wndPtr->dwStyle,
-		   HAS_MENU(wndPtr), wndPtr->dwExStyle );
-    
+    NC_AdjustRect( &tmpRect, wndPtr->dwStyle, FALSE, wndPtr->dwExStyle );
     params->rgrc[0].left   -= tmpRect.left;
     params->rgrc[0].top    -= tmpRect.top;
     params->rgrc[0].right  -= tmpRect.right;
     params->rgrc[0].bottom -= tmpRect.bottom;
+
+    if (HAS_MENU(wndPtr))
+    {
+	params->rgrc[0].top += MENU_GetMenuBarHeight( hwnd,
+				params->rgrc[0].right - params->rgrc[0].left );
+    }
     return 0;
 }
 
diff --git a/windows/win.c b/windows/win.c
index d768512..f03902d 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -24,6 +24,11 @@
 extern void EVENT_RegisterWindow( Window w, HWND hwnd );  /* event.c */
 extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor );  /* cursor.c */
 extern void WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg ); /*winpos.c*/
+extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
+				   RECT *newWindowRect, RECT *oldWindowRect,
+				   RECT *oldClientRect, WINDOWPOS *winpos,
+				   RECT *newClientRect );  /* winpos.c */
+
 extern HMENU CopySysMenu(); /* menu.c */
 extern LONG MDIClientWndProc(HWND hwnd, WORD message, 
 			     WORD wParam, LONG lParam); /* mdi.c */
@@ -453,19 +458,8 @@
     if (!wmcreate) wmcreate = -1;
     else
     {
-	  /* Send WM_NCCALCSIZE message */
-	NCCALCSIZE_PARAMS *params;
-	HANDLE hparams;
-	hparams = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(*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 );
-	}	
+	WINPOS_SendNCCalcSize( hwnd, FALSE, &wndPtr->rectWindow,
+			       NULL, NULL, NULL, &wndPtr->rectClient );
 	wmcreate = SendMessage( hwnd, WM_CREATE, 0, (LONG)createStruct );
     }
 
diff --git a/windows/winpos.c b/windows/winpos.c
index a9fe9a6..f60ea4a 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -438,6 +438,234 @@
 
 
 /***********************************************************************
+ *           WINPOS_SendNCCalcSize
+ *
+ * Send a WM_NCCALCSIZE message to a window.
+ * All parameters are read-only except newClientRect.
+ * oldWindowRect, oldClientRect and winpos must be non-NULL only
+ * when calcValidRect is TRUE.
+ */
+LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect, RECT *newWindowRect,
+			    RECT *oldWindowRect, RECT *oldClientRect,
+			    WINDOWPOS *winpos, RECT *newClientRect )
+{
+    NCCALCSIZE_PARAMS *params;
+    HANDLE hparams;
+    LONG result;
+
+    if (!(hparams = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(*params) )))
+	return 0;
+    params = (NCCALCSIZE_PARAMS *) USER_HEAP_ADDR( hparams );
+    params->rgrc[0] = *newWindowRect;
+    if (calcValidRect)
+    {
+	params->rgrc[1] = *oldWindowRect;
+	params->rgrc[2] = *oldClientRect;
+	params->lppos = winpos;
+    }
+    result = SendMessage( hwnd, WM_NCCALCSIZE, calcValidRect, (LONG)params);
+    *newClientRect = params->rgrc[0];
+    USER_HEAP_FREE( hparams );
+    return result;
+}
+
+
+/***********************************************************************
+ *           WINPOS_HandleWindowPosChanging
+ *
+ * Default handling for a WM_WINDOWPOSCHANGING. Called from DefWindowProc().
+ */
+LONG WINPOS_HandleWindowPosChanging( WINDOWPOS *winpos )
+{
+    POINT maxSize;
+    WND *wndPtr = WIN_FindWndPtr( winpos->hwnd );
+    if (!wndPtr || (winpos->flags & SWP_NOSIZE)) return 0;
+    if ((wndPtr->dwStyle & WS_THICKFRAME) ||
+	(wndPtr->dwStyle & (WS_POPUP | WS_CHILD) == 0))
+    {
+	WINPOS_GetMinMaxInfo( winpos->hwnd, &maxSize, NULL, NULL, NULL );
+	winpos->cx = min( winpos->cx, maxSize.x );
+	winpos->cy = min( winpos->cy, maxSize.y );
+    }
+    return 0;
+}
+
+
+/***********************************************************************
+ *           WINPOS_InternalSetWindowPos
+ *
+ * Helper function for SetWindowPos.
+ */
+static BOOL WINPOS_InternalSetWindowPos( WINDOWPOS *winpos )
+{
+    HWND hwndAfter;
+    WND *wndPtr;
+    RECT newWindowRect, newClientRect;
+    int flags, result;
+    int changeMask = 0;
+    XWindowChanges winChanges;
+
+      /* Send WM_WINDOWPOSCHANGING message */
+
+    if (!(winpos->flags & SWP_NOSENDCHANGING))
+	SendMessage( winpos->hwnd, WM_WINDOWPOSCHANGING, 0, (LONG)winpos );
+
+      /* Check window handle */
+
+    if (winpos->hwnd == GetDesktopWindow()) return FALSE;
+    if (!(wndPtr = WIN_FindWndPtr( winpos->hwnd ))) return FALSE;
+
+      /* Check dimensions */
+
+    if (winpos->cx <= 0) winpos->cx = 1;
+    if (winpos->cy <= 0) winpos->cy = 1;
+
+      /* Check flags */
+
+    flags = winpos->flags;
+    if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW))
+	flags |= SWP_NOMOVE | SWP_NOSIZE;
+    if (winpos->hwnd == hwndActive) flags |= SWP_NOACTIVATE; /*Already active*/
+
+      /* Check hwndAfter */
+
+    hwndAfter = winpos->hwndInsertAfter;
+    if (!(flags & (SWP_NOZORDER | SWP_NOACTIVATE)))
+    {
+	  /* Ignore TOPMOST flags when activating a window */
+          /* _and_ moving it in Z order. */
+	if ((hwndAfter == HWND_TOPMOST) || (hwndAfter == HWND_NOTOPMOST))
+	    hwndAfter = HWND_TOP;	
+    }
+      /* TOPMOST not supported yet */
+    if ((hwndAfter == HWND_TOPMOST) || (hwndAfter == HWND_NOTOPMOST))
+	hwndAfter = HWND_TOP;
+      /* hwndAfter must be a sibling of the window */
+    if ((hwndAfter != HWND_TOP) && (hwndAfter != HWND_BOTTOM) &&
+	(GetParent(winpos->hwnd) != GetParent(hwndAfter))) return FALSE;
+
+      /* Calculate new position and size */
+
+    newWindowRect = wndPtr->rectWindow;
+    newClientRect = wndPtr->rectClient;
+
+    if (!(flags & SWP_NOSIZE))
+    {
+	newWindowRect.right  = newWindowRect.left + winpos->cx;
+	newWindowRect.bottom = newWindowRect.top + winpos->cy;
+	winChanges.width     = winpos->cx;
+	winChanges.height    = winpos->cy;
+	changeMask |= CWWidth | CWHeight;
+    }
+    if (!(flags & SWP_NOMOVE))
+    {
+	newWindowRect.left    = winpos->x;
+	newWindowRect.top     = winpos->y;
+	newWindowRect.right  += winpos->x - wndPtr->rectWindow.left;
+	newWindowRect.bottom += winpos->y - wndPtr->rectWindow.top;
+	if (wndPtr->dwStyle & WS_CHILD)
+	{
+	    WND *parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
+	    winChanges.x = winpos->x + parentPtr->rectClient.left 
+		           - parentPtr->rectWindow.left;
+	    winChanges.y = winpos->y + parentPtr->rectClient.top
+		           - parentPtr->rectWindow.top;
+	}
+	else
+	{
+	    winChanges.x = winpos->x;
+	    winChanges.y = winpos->y;
+	}
+	changeMask |= CWX | CWY;
+    }
+
+      /* Reposition window in Z order */
+
+    if (!(flags & SWP_NOZORDER))
+    {
+	WIN_UnlinkWindow( winpos->hwnd );
+	WIN_LinkWindow( winpos->hwnd, hwndAfter );
+	if (hwndAfter == HWND_TOP) winChanges.stack_mode = Above;
+	else winChanges.stack_mode = Below;
+	if ((hwndAfter != HWND_TOP) && (hwndAfter != HWND_BOTTOM))
+	{
+	    WND * insertPtr = WIN_FindWndPtr( hwndAfter );
+	    winChanges.sibling = insertPtr->window;
+	    changeMask |= CWSibling;
+	}
+	changeMask |= CWStackMode;
+    }
+
+      /* Send WM_NCCALCSIZE message to get new client area */
+
+    result = WINPOS_SendNCCalcSize( winpos->hwnd, TRUE, &newWindowRect,
+				    &wndPtr->rectWindow, &wndPtr->rectClient,
+				    winpos, &newClientRect );
+    /* ....  Should handle result here */
+
+      /* Perform the moving and resizing */
+
+    if (changeMask) XConfigureWindow( display, wndPtr->window,
+				      changeMask, &winChanges );
+    wndPtr->rectWindow = newWindowRect;
+    wndPtr->rectClient = newClientRect;
+
+    if (flags & SWP_SHOWWINDOW)
+    {
+	wndPtr->dwStyle |= WS_VISIBLE;
+	XMapWindow( display, wndPtr->window );
+	MSG_Synchronize();
+	if (flags & SWP_NOREDRAW)  /* Validate the whole window */
+	    RedrawWindow( winpos->hwnd, NULL, 0, RDW_VALIDATE );
+    }
+    else if (flags & SWP_HIDEWINDOW)
+    {
+	wndPtr->dwStyle &= ~WS_VISIBLE;
+	XUnmapWindow( display, wndPtr->window );
+	if ((winpos->hwnd == GetFocus()) || IsChild(winpos->hwnd, GetFocus()))
+	    SetFocus( GetParent(winpos->hwnd) );  /* Revert focus to parent */
+	if (winpos->hwnd == hwndActive)
+	{
+	      /* Activate previously active window if possible */
+	    HWND newActive = wndPtr->hwndPrevActive;
+	    if (!IsWindow(newActive) || (newActive == winpos->hwnd))
+	    {
+		newActive = GetTopWindow(GetDesktopWindow());
+		if (newActive == winpos->hwnd) newActive = wndPtr->hwndNext;
+	    }	    
+	    WINPOS_ChangeActiveWindow( newActive, FALSE );
+	}
+    }
+
+      /* Activate the window */
+
+    if (!(flags & SWP_NOACTIVATE))
+    {
+	if (!(wndPtr->dwStyle & WS_CHILD))
+	    WINPOS_ChangeActiveWindow( winpos->hwnd, FALSE );
+    }
+    
+      /* Send WM_NCPAINT message if needed */
+
+    if ((flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) ||
+	(!(flags & SWP_NOSIZE)) || (!(flags & SWP_NOMOVE)) ||
+	(!(flags & SWP_NOACTIVATE)) || (!(flags & SWP_NOZORDER)))
+	    SendMessage( winpos->hwnd, WM_NCPAINT, 1, 0L );
+#if 0
+    if ((flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) &&
+	(!(flags & SWP_NOREDRAW)) && 
+	(wndPtr->dwStyle & WS_VISIBLE))
+	InvalidateRect(winpos->hwnd, NULL, TRUE);
+#endif
+
+      /* And last, send the WM_WINDOWPOSCHANGED message */
+
+    SendMessage( winpos->hwnd, WM_WINDOWPOSCHANGED, 0, (LONG)winpos );
+    return TRUE;
+}
+
+					
+/***********************************************************************
  *           SetWindowPos   (USER.232)
  */
 /* Note: all this code should be in the DeferWindowPos() routines,
@@ -449,23 +677,13 @@
 {
     WINDOWPOS *winPos;
     HANDLE hmem = 0;
-    RECT newWindowRect, newClientRect;
-    WND *wndPtr;
-    int calcsize_result = 0;
-    XWindowChanges winChanges;
-    int changeMask = 0;
+    BOOL res;
 
 #ifdef DEBUG_WIN
     printf( "SetWindowPos: %04X %d %d,%d %dx%d 0x%x\n",
 	    hwnd, hwndInsertAfter, x, y, cx, cy, flags );
 #endif
 
-    if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE;
-    if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW))
-	flags |= SWP_NOMOVE | SWP_NOSIZE;
-
-      /* Send WM_WINDOWPOSCHANGING message */
-
     if (!(hmem = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(WINDOWPOS) )))
 	return FALSE;
     winPos = (WINDOWPOS *)USER_HEAP_ADDR( hmem );
@@ -476,183 +694,9 @@
     winPos->cx = cx;
     winPos->cy = cy;
     winPos->flags = flags;
-    SendMessage( hwnd, WM_WINDOWPOSCHANGING, 0, (LONG)winPos );
-    hwndInsertAfter = winPos->hwndInsertAfter;
 
-      /* Some sanity checks */
+    res = WINPOS_InternalSetWindowPos( winPos );
 
-    if (!IsWindow( hwnd ) || (hwnd == GetDesktopWindow())) goto Abort;
-    if (flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW))
-	flags |= SWP_NOMOVE | SWP_NOSIZE;
-    if (!(flags & (SWP_NOZORDER | SWP_NOACTIVATE)))
-    {
-	if (hwnd != hwndActive) hwndInsertAfter = HWND_TOP;
-	else if ((hwndInsertAfter == HWND_TOPMOST) ||
-		 (hwndInsertAfter == HWND_NOTOPMOST))
-	    hwndInsertAfter = HWND_TOP;	
-    }
-
-      /* Calculate new position and size */
-
-    newWindowRect = wndPtr->rectWindow;
-    newClientRect = wndPtr->rectClient;
-
-    if (!(winPos->flags & SWP_NOSIZE))
-    {
-	newWindowRect.right  = newWindowRect.left + winPos->cx;
-	newWindowRect.bottom = newWindowRect.top + winPos->cy;
-    }
-
-    if (!(winPos->flags & SWP_NOMOVE))
-    {
-	newWindowRect.left    = winPos->x;
-	newWindowRect.top     = winPos->y;
-	newWindowRect.right  += winPos->x - wndPtr->rectWindow.left;
-	newWindowRect.bottom += winPos->y - wndPtr->rectWindow.top;
-    }
-
-      /* Reposition window in Z order */
-
-    if (!(winPos->flags & SWP_NOZORDER))
-    {
-	  /* TOPMOST not supported yet */
-	if ((hwndInsertAfter == HWND_TOPMOST) ||
-	    (hwndInsertAfter == HWND_NOTOPMOST)) hwndInsertAfter = HWND_TOP;
-
-	  /* Make sure hwndInsertAfter is a sibling of hwnd */
-	if ((hwndInsertAfter != HWND_TOP) && (hwndInsertAfter != HWND_BOTTOM))
-	    if (GetParent(hwnd) != GetParent(hwndInsertAfter)) goto Abort;
-
-	WIN_UnlinkWindow( hwnd );
-	WIN_LinkWindow( hwnd, hwndInsertAfter );
-    }
-
-      /* Recalculate client area position */
-
-    if (winPos->flags & SWP_FRAMECHANGED)
-    {
-	  /* Send WM_NCCALCSIZE message */
-	NCCALCSIZE_PARAMS *params;
-	HANDLE hparams;
-	
-	if (!(hparams = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(*params) )))
-	    goto Abort;
-	params = (NCCALCSIZE_PARAMS *) USER_HEAP_ADDR( hparams );
-	params->rgrc[0] = newWindowRect;
-	params->rgrc[1] = wndPtr->rectWindow;
-	params->rgrc[2] = wndPtr->rectClient;
-	params->lppos = winPos;
-	calcsize_result = SendMessage(hwnd, WM_NCCALCSIZE, TRUE, (LONG)params);
-	USER_HEAP_FREE( hparams );
-	newClientRect = params->rgrc[0];
-	/* Handle result here */
-    }
-    else
-    {
-	newClientRect.left   = newWindowRect.left + wndPtr->rectClient.left
-	                       - wndPtr->rectWindow.left;
-	newClientRect.top    = newWindowRect.top + wndPtr->rectClient.top
-	                       - wndPtr->rectWindow.top;
-	newClientRect.right  = newWindowRect.right + wndPtr->rectClient.right
-	                       - wndPtr->rectWindow.right;
-	newClientRect.bottom = newWindowRect.bottom + wndPtr->rectClient.bottom
-	                       - wndPtr->rectWindow.bottom;
-    }
-    
-      /* Perform the moving and resizing */
-
-    if (!(winPos->flags & SWP_NOMOVE))
-    {
-	WND * parentPtr;
-	winChanges.x = newWindowRect.left;
-	winChanges.y = newWindowRect.top;
-	if (wndPtr->dwStyle & WS_CHILD)
-	{
-	    parentPtr = WIN_FindWndPtr(wndPtr->hwndParent);
-	    winChanges.x += parentPtr->rectClient.left-parentPtr->rectWindow.left;
-	    winChanges.y += parentPtr->rectClient.top-parentPtr->rectWindow.top;
-	}
-	changeMask |= CWX | CWY;
-    }
-    if (!(winPos->flags & SWP_NOSIZE))
-    {
-	winChanges.width  = newWindowRect.right - newWindowRect.left;
-	winChanges.height = newWindowRect.bottom - newWindowRect.top;
-	changeMask |= CWWidth | CWHeight;
-    }
-    if (!(winPos->flags & SWP_NOZORDER))
-    {
-	if (hwndInsertAfter == HWND_TOP) winChanges.stack_mode = Above;
-	else winChanges.stack_mode = Below;
-	if ((hwndInsertAfter != HWND_TOP) && (hwndInsertAfter != HWND_BOTTOM))
-	{
-	    WND * insertPtr = WIN_FindWndPtr( hwndInsertAfter );
-	    winChanges.sibling = insertPtr->window;
-	    changeMask |= CWSibling;
-	}
-	changeMask |= CWStackMode;
-    }
-	if ((newWindowRect.right - newWindowRect.left) != 0 &&
-		(newWindowRect.bottom - newWindowRect.top) != 0)
-		if (changeMask) XConfigureWindow( display, wndPtr->window,
-									changeMask, &winChanges );
-
-	if ((newWindowRect.right - newWindowRect.left) != 0 &&
-		(newWindowRect.bottom - newWindowRect.top) != 0 &&
-		(winPos->flags & SWP_SHOWWINDOW))
-    {
-	wndPtr->dwStyle |= WS_VISIBLE;
-	XMapWindow( display, wndPtr->window );
-	MSG_Synchronize();
-/*	if (winPos->flags & SWP_NOREDRAW)
-	    RedrawWindow( hwnd, NULL, 0, RDW_VALIDATE ); */
-    }
-    else if (winPos->flags & SWP_HIDEWINDOW)
-    {
-	wndPtr->dwStyle &= ~WS_VISIBLE;
-	XUnmapWindow( display, wndPtr->window );
-	if ((hwnd == GetFocus()) || IsChild( hwnd, GetFocus() ))
-	    SetFocus( GetParent(hwnd) );  /* Revert focus to parent (if any) */
-	if (hwnd == hwndActive)
-	{
-	      /* Activate previously active window if possible */
-	    HWND newActive = wndPtr->hwndPrevActive;
-	    if (!IsWindow(newActive) || (newActive == hwnd))
-	    {
-		newActive = GetTopWindow(GetDesktopWindow());
-		if (newActive == hwnd) newActive = wndPtr->hwndNext;
-	    }	    
-	    WINPOS_ChangeActiveWindow( newActive, FALSE );
-	}
-    }
-
-    if (!(winPos->flags & SWP_NOACTIVATE))
-    {
-	if (!(wndPtr->dwStyle & WS_CHILD))
-	    WINPOS_ChangeActiveWindow( hwnd, FALSE );
-    }
-    
-      /* Send WM_NCPAINT message if needed */
-    if ((winPos->flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) ||
-	(!(winPos->flags & SWP_NOSIZE)) ||
-	(!(winPos->flags & SWP_NOMOVE)) ||
-	(!(winPos->flags & SWP_NOACTIVATE)) ||
-	(!(winPos->flags & SWP_NOZORDER)))
-	    SendMessage( hwnd, WM_NCPAINT, 1, 0L );
-    if ((winPos->flags & (SWP_FRAMECHANGED | SWP_SHOWWINDOW)) &&
-		(!(winPos->flags & SWP_NOREDRAW)) && 
-		(wndPtr->dwStyle & WS_VISIBLE) && IsWindowVisible(hwnd))
-		InvalidateRect(hwnd, NULL, TRUE);
-
-      /* Finally send the WM_WINDOWPOSCHANGED message */
-    wndPtr->rectWindow = newWindowRect;
-    wndPtr->rectClient = newClientRect;
-    SendMessage( hwnd, WM_WINDOWPOSCHANGED, 0, (LONG)winPos );
     USER_HEAP_FREE( hmem );
-
-    return TRUE;
-
- Abort:  /* Fatal error encountered */
-    if (hmem) USER_HEAP_FREE( hmem );
-    return FALSE;
+    return res;
 }
