Release 970112

Sat Jan 11 18:17:59 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/menu.c]
	Updated to new Win32 types.

	* [controls/listbox.c]
	Fixed Winfile extended selection bug.

	* [files/directory.c]
	Changed DIR_SearchPath to return both long and short file names.

	* [files/dos_fs.c]
	Implemented VFAT ioctl to retrieve the original short filenames
	from a VFAT filesystem (Linux only for now).
	Replaced DOSFS_GetUnixFileName()/DOSFS_GetDosTrueName() by
	DOS_GetFullName().
	Properly implemented GetShortPathName() and GetFullPathName().
	Made all functions re-entrant.

	* [files/file.c] [misc/main.c]
	Replaced -allowreadonly option by -failreadonly. The default is
	now to report success when opening a read-only file for writing.

	* [objects/metafile.c]
	Fixed bug in DIB bitmaps pointer calculation.

	* [scheduler/process.c]
	Implemented environment strings and Get/SetStdHandle with process
 	environment block.

	* [tools/build.c]
	Rewrote BuildContext32() to avoid instructions that may not be
	supported by all assemblers.
	
Fri Jan 10 17:11:09 1997  David Faure  <david.faure@ifhamy.insa-lyon.fr>

	* [windows/event.c]
	Created table keyc2vkey, which associate a vkey(+extended bit) to
	any keycode. Changed EVENT_event_to_vkey to use this table to
	return the correct vkey. Changed EVENT_ToAscii to get the keycode
	from this table too.  Assigned OEM specific vkeys arbitrarily.

Fri Jan 10 09:26:17 1997  John Harvey <john@division.co.uk>

	* [misc/winsock.c] [misc/winsoc_async.c]
        Fixed svr4 header files.
        Changed bzero() to memset().

	* [tools/fnt2bdf.c]
        Removed bcopy() and used memcpy() instead.

	* [debugger/msc.c]
        Include string.h instead of strings.h

	* [debugger/stabs.c]
        Include string.h instead of strings.h.
        Define __ELF__ for svr4 systems.

	* [loader/signal.c]
        Use wait() instead of wait4() which doesnt exist on Unixware.

	* [memory/global.c]
        Use sysconf() instead of getpagesize() for svr4 systems.

Thu Jan  9 21:07:20 1997  Robert Pouliot <krynos@clic.net>

	* [Make.rules.in] [Makefile.in] [make_os2.sh] [rc/Makefile.in]
	  [tools/Makefile.in] [documentation/wine_os2.txt]
	Patches for OS/2 support. Note that it doesn't compile yet.

Tue Jan  7 20:03:53 1997  Eric Youngdale <eric@sub2304.jic.com>

	* [debugger/*]
	Many more debugger improvements (see debugger/README for details).

Tue Jan  7 15:12:21 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [windows/graphics.c] [objects/text.c] [graphics/x11drv/*]
	  [graphics/metafiledrv/*]
	Moved some device dependent code into the resp. subdirs.

	* [include/gdi.h] [include/metafiledrv.h] [include/x11drv.h]
	Prototypes added,
	DC_FUNCTIONS: GetPixel added, some unnecessary functions removed.

	* [objects/region.c]
	CreatePolyPolygonRgn32 added.

	* [files/dos_fs.c]
	QueryDosDevice added.

	* [misc/lstr.c]
	FormatMessage: broken heap management fixed.

	* [scheduler/process.c] [scheduler/thread.c]
	Get/SetThreadPriority/PriorityClass added.

Mon Jan  6 21:55:30 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [misc/keyboard.c]
	ToAscii : Use EVENT_ToAscii instead.

	* [windows/event.c]
	keypad_key : Do not convert XK_Mode_switch to VK_MENU; recognize
	keypad cursor keys.
	EVENT_event_to_vkey : New function, to transform a X keycode
	into a MSwin vkey + extended bit.
	EVENT_ToAscii : New function, to transform a vkey + extended bit
	(+ key state table) into ascii char(s), using XLookupString, and
	recognizing dead chars.
	EVENT_key : Transform AltGr into Ctrl+Alt sequence; call
	EVENT_event_to_vkey for keycode to vkey conversion; fixed
	previous, context and extended bits.

	* [windows/keyboard.c]
	Include stddebug.h, to get -debugmsg messages.
	GetKeyState : Handle VK_MBUTTON case.
	GetKeyboardState, SetKeyboardState : Debugging messages added.

	* [windows/message.c]
	TranslateMessage : Handle dead chars.

Mon Jan  6 20:10:11 1997  Dominik Strasser  <bm424953@muenchen.org>

	* [if1632/crtdll.spec] [misc/crtdll.c]
	C++ functions new/delete/set_new_handler implemented.

Mon Jan  6 15:48:15 1997 Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl>

	* [controls/edit.c] [include/windows.h]
	Moved the edit control to 32 bits.
	Included new (win95) message definitions in windows.h
	Implemented EM_SCROLLCARET, EM_SETMARGINS, EM_GETMARGINS,
	EM_GETLIMITTEXT, EM_POSFROMCHAR, EM_CHARFROMPOS.
	Broke EM_SETWORDBREAKPROC (internal wordwrap still works).
	Fixed some bugs, introduced a couple of others.
	Text buffer is now initially in 32-bit heap.

	* [controls/EDIT.TODO] [controls/combo.c] [controls/widgets.c]
	  [if1632/wprocs.spec] [library/miscstubs.c] [windows/defdlg.c]
	  [misc/commdlg.c]
	Updated to work with 32-bit edit control.

Sat Jan  4 22:07:27 1997  O.Flebbe  <O.Flebbe@science-computing.uni-tuebingen.de>

	* [loader/pe_image.c]
	Use mmap rather then malloc. Better workaround for clean
	segments.
diff --git a/controls/edit.c b/controls/edit.c
index 3cb1372..e53103e 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -3,14 +3,18 @@
  *
  *	Copyright  David W. Metcalfe, 1994
  *	Copyright  William Magro, 1995, 1996
- *	Copyright  Frans van Dorsselaer, 1996
+ *	Copyright  Frans van Dorsselaer, 1996, 1997
  *
  */
 
 /*
- *	UNDER CONSTRUCTION, please read EDIT.TODO
+ *	please read EDIT.TODO (and update it when you change things)
+ *	It also contains a discussion about the 16 to 32 bit transition.
+ *
  */
 
+
+#define NO_TRANSITION_TYPES	/* This file is Win32-clean */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -20,9 +24,12 @@
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
+/*
 #include "callback.h"
+*/
 
 #define BUFLIMIT_MULTI		65534	/* maximum text buffer length (not including '\0') */
+					/* FIXME: BTW, new specs say 65535 (do you dare ???) */
 #define BUFLIMIT_SINGLE		32766
 #define BUFSTART_MULTI		1024	/* starting length for multi-line control */
 #define BUFSTART_SINGLE		256	/* starting length for single line control */
@@ -39,38 +46,73 @@
 } LINE_END;
 
 typedef struct {
-	UINT offset;
-	UINT length;
+	INT32 offset;
+	INT32 length;
 	LINE_END ending;
 } LINEDEF;
 
 typedef struct
 {
-	UINT TextWidth;		/* width of the widest line in pixels */
-	HLOCAL16 hBuf;
-	char *text;
-	HFONT16 hFont;
-	LINEDEF *LineDefs;
-	UINT XOffset;		/* offset of the viewport in pixels */
-	UINT FirstVisibleLine;
-	UINT LineCount;
-	UINT LineHeight;	/* height of a screen line in pixels */
-	UINT AveCharWidth;	/* average character width in pixels */
-	UINT BufLimit;
-	UINT BufSize;
-	BOOL TextChanged;
-	BOOL Redraw;
-	UINT SelStart;		/* offset of selection start, == SelEnd if no selection */
-	UINT SelEnd;		/* offset of selection end == current caret position */
-	UINT NumTabStops;
+	HLOCAL16 hBuf16;	/* For when a 16-bit multiline edit
+				 * control gets a EM_GETHANDLE (which
+				 * should return 16-bit local heap).
+				 * From that point on we _have_ to keep
+				 * using 16-bit local heap (apps rely
+				 * on that ... bummer).
+				 */
+	HLOCAL32 hBuf32;	/* Don't worry about 'LOCAL'.  LOCAL32 is
+				 * identical to GLOBAL32, which is
+				 * essentially a HANDLE32 created with
+				 * HeapAlloc(GetProcessHeap(), ...) plus
+				 * a global32 (and thus local32)
+				 * descriptor, which we can return upon
+				 * EM_GETHANDLE32.
+				 * It is 32-bit linear addressing, so
+				 * everything is fine.
+				 */
+	LPSTR text;		/* Depending on the fact that we are a
+				 * 16 or 32 bit control, this is the
+				 * pointer that we get after
+				 * LocalLock32(hBuf23) (which is a typecast :-)
+				 * or LOCAL_Lock(hBuf16).
+				 * This is always a 32-bit linear pointer.
+				 */
+	HFONT32 hFont;
+	LINEDEF *LineDefs;	/* Internal table for (soft) linebreaks */
+	INT32 TextWidth;	/* width of the widest line in pixels */
+	INT32 XOffset;		/* offset of the viewport in pixels */
+	INT32 FirstVisibleLine;
+	INT32 LineCount;
+	INT32 LineHeight;	/* height of a screen line in pixels */
+	INT32 AveCharWidth;	/* average character width in pixels */
+	INT32 BufLimit;
+	INT32 BufSize;
+	BOOL32 TextChanged;
+	BOOL32 CanUndo;
+	BOOL32 Redraw;
+	INT32 SelStart;		/* offset of selection start, == SelEnd if no selection */
+	INT32 SelEnd;		/* offset of selection end == current caret position */
+	INT32 NumTabStops;
 	LPINT16 TabStops;
-	EDITWORDBREAKPROC WordBreakProc;
-	char PasswordChar;
+	/*
+	 *	FIXME: The following should probably be a (VOID *) that is
+	 *	typecast to either 16- or 32-bit callback when used,
+	 *	depending on the type of edit control (16 or 32 bit).
+	 *
+	 *	EDITWORDBREAKPROC WordBreakProc;
+	 *
+	 *	For now: no more application specific wordbreaking.
+	 *	(Internal wordbreak function still works)
+	 */
+	CHAR PasswordChar;
+	INT32 LeftMargin;
+	INT32 RightMargin;
+	RECT32 FormatRect;
 } EDITSTATE;
 
 
-#define SWAP_UINT(x,y) do { UINT temp = (UINT)(x); (x) = (UINT)(y); (y) = temp; } while(0)
-#define ORDER_UINT(x,y) do { if ((UINT)(y) < (UINT)(x)) SWAP_UINT((x),(y)); } while(0)
+#define SWAP_INT32(x,y) do { INT32 temp = (INT32)(x); (x) = (INT32)(y); (y) = temp; } while(0)
+#define ORDER_INT32(x,y) do { if ((INT32)(y) < (INT32)(x)) SWAP_INT32((x),(y)); } while(0)
 
 /* macros to access window styles */
 #define IsMultiLine(wndPtr) ((wndPtr)->dwStyle & ES_MULTILINE)
@@ -86,15 +128,19 @@
 
 #define EDIT_SEND_CTLCOLOR(wndPtr,hdc) \
     (SendMessage32A((wndPtr)->parent->hwndSelf, WM_CTLCOLOREDIT, \
-                    (WPARAM32)(hdc), (LPARAM)(wndPtr)->hwndSelf ))
+		    (WPARAM32)(hdc), (LPARAM)(wndPtr)->hwndSelf ))
 #define EDIT_NOTIFY_PARENT(wndPtr, wNotifyCode) \
     (SendMessage32A((wndPtr)->parent->hwndSelf, WM_COMMAND, \
-                    MAKEWPARAM((wndPtr)->wIDmenu, wNotifyCode), \
-                    (LPARAM)(wndPtr)->hwndSelf ))
-#define DPRINTF_EDIT_MSG(str) \
+		    MAKEWPARAM((wndPtr)->wIDmenu, wNotifyCode), \
+		    (LPARAM)(wndPtr)->hwndSelf ))
+#define DPRINTF_EDIT_MSG16(str) \
     dprintf_edit(stddeb, \
-                 "edit: " str ": hwnd=%04x, wParam=%04x, lParam=%08x\n", \
-                 (UINT32)hwnd, (UINT32)wParam, (UINT32)lParam)
+		 "edit: 16 bit : " str ": hwnd=%08x, wParam=%08x, lParam=%08x\n  ", \
+		 (UINT32)hwnd, (UINT32)wParam, (UINT32)lParam)
+#define DPRINTF_EDIT_MSG32(str) \
+    dprintf_edit(stddeb, \
+		 "edit: 32 bit : " str ": hwnd=%08x, wParam=%08x, lParam=%08x\n", \
+		 (UINT32)hwnd, (UINT32)wParam, (UINT32)lParam)
 
 
 /*********************************************************************
@@ -104,76 +150,84 @@
  *	Files like these should really be kept in alphabetical order.
  *
  */
-LRESULT EditWndProc(HWND hwnd, UINT msg, WPARAM16 wParam, LPARAM lParam);
+LRESULT EditWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam);
 
 static void    EDIT_BuildLineDefs(WND *wndPtr);
-static INT     EDIT_CallWordBreakProc(WND *wndPtr, char *s, INT index, INT count, INT action);
-static UINT    EDIT_ColFromWndX(WND *wndPtr, UINT line, INT x);
+static INT32   EDIT_CallWordBreakProc(WND *wndPtr, LPSTR s, INT32 index, INT32 count, INT32 action);
+static INT32   EDIT_ColFromWndX(WND *wndPtr, INT32 line, INT32 x);
 static void    EDIT_DelEnd(WND *wndPtr);
 static void    EDIT_DelLeft(WND *wndPtr);
 static void    EDIT_DelRight(WND *wndPtr);
-static UINT    EDIT_GetAveCharWidth(WND *wndPtr);
-static UINT    EDIT_GetLineHeight(WND *wndPtr);
-static void    EDIT_GetLineRect(WND *wndPtr, UINT line, UINT scol, UINT ecol, LPRECT16 rc);
-static char *  EDIT_GetPointer(WND *wndPtr);
-static char *  EDIT_GetPasswordPointer(WND *wndPtr);
-static LRESULT EDIT_GetRect(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
-static BOOL    EDIT_GetRedraw(WND *wndPtr);
-static LRESULT EDIT_GetSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
-static UINT    EDIT_GetTextWidth(WND *wndPtr);
-static UINT    EDIT_GetVisibleLineCount(WND *wndPtr);
-static UINT    EDIT_GetWndWidth(WND *wndPtr);
-static UINT    EDIT_GetXOffset(WND *wndPtr);
-static void    EDIT_InvalidateText(WND *wndPtr, UINT start, UINT end);
-static UINT    EDIT_LineFromWndY(WND *wndPtr, INT y);
-static BOOL    EDIT_MakeFit(WND *wndPtr, UINT size);
-static void    EDIT_MoveBackward(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveDownward(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveEnd(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveForward(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveHome(WND *wndPtr, BOOL extend);
-static void    EDIT_MovePageDown(WND *wndPtr, BOOL extend);
-static void    EDIT_MovePageUp(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveUpward(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveWordBackward(WND *wndPtr, BOOL extend);
-static void    EDIT_MoveWordForward(WND *wndPtr, BOOL extend);
-static void    EDIT_PaintLine(WND *wndPtr, HDC32 hdc, UINT line, BOOL rev);
-static UINT    EDIT_PaintText(WND *wndPtr, HDC32 hdc, INT x, INT y, UINT line, UINT col, UINT count, BOOL rev);
+static INT32   EDIT_GetAveCharWidth(WND *wndPtr);
+static INT32   EDIT_GetLineHeight(WND *wndPtr);
+static void    EDIT_GetLineRect(WND *wndPtr, INT32 line, INT32 scol, INT32 ecol, LPRECT32 rc);
+static LPSTR   EDIT_GetPointer(WND *wndPtr);
+static LPSTR   EDIT_GetPasswordPointer(WND *wndPtr);
+static BOOL32  EDIT_GetRedraw(WND *wndPtr);
+static void    EDIT_GetSel(WND *wndPtr, LPINT32 s, LPINT32 e);
+static INT32   EDIT_GetTextWidth(WND *wndPtr);
+static INT32   EDIT_GetVisibleLineCount(WND *wndPtr);
+static INT32   EDIT_GetWndWidth(WND *wndPtr);
+static INT32   EDIT_GetXOffset(WND *wndPtr);
+static void    EDIT_InvalidateText(WND *wndPtr, INT32 start, INT32 end);
+static INT32   EDIT_LineFromWndY(WND *wndPtr, INT32 y);
+static BOOL32  EDIT_MakeFit(WND *wndPtr, INT32 size);
+static void    EDIT_MoveBackward(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveDownward(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveEnd(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveForward(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveHome(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MovePageDown(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MovePageUp(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveUpward(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveWordBackward(WND *wndPtr, BOOL32 extend);
+static void    EDIT_MoveWordForward(WND *wndPtr, BOOL32 extend);
+static void    EDIT_PaintLine(WND *wndPtr, HDC32 hdc, INT32 line, BOOL32 rev);
+static INT32   EDIT_PaintText(WND *wndPtr, HDC32 hdc, INT32 x, INT32 y, INT32 line, INT32 col, INT32 count, BOOL32 rev);
 static void    EDIT_ReleasePointer(WND *wndPtr);
-static LRESULT EDIT_ReplaceSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
-static void    EDIT_ScrollIntoView(WND *wndPtr);
-static INT     EDIT_WndXFromCol(WND *wndPtr, UINT line, UINT col);
-static INT     EDIT_WndYFromLine(WND *wndPtr, UINT line);
-static INT     EDIT_WordBreakProc(char *s, INT index, INT count, INT action);
+static INT32   EDIT_WndXFromCol(WND *wndPtr, INT32 line, INT32 col);
+static INT32   EDIT_WndYFromLine(WND *wndPtr, INT32 line);
+static INT32   EDIT_WordBreakProc(LPSTR s, INT32 index, INT32 count, INT32 action);
 
 static LRESULT EDIT_EM_CanUndo(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_CharFromPos(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_EmptyUndoBuffer(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_FmtLines(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetFirstVisibleLine(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetHandle(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_GetHandle16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_GetLimitText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetLine(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetLineCount(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_GetMargins(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetModify(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetPasswordChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetRect(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_GetRect16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetThumb(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_GetWordBreakProc(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
-static LRESULT EDIT_EM_LimitText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_LineFromChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_LineIndex(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_LineLength(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_LineScroll(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_PosFromChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_ReplaceSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_Scroll(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_ScrollCaret(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetHandle(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_SetHandle16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_SetLimitText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_SetMargins(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetModify(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetPasswordChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetReadOnly(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetRect(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetRectNP(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_SetSel16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetTabStops(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
+static LRESULT EDIT_EM_SetTabStops16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_SetWordBreakProc(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 static LRESULT EDIT_EM_Undo(WND *wndPtr, WPARAM32 wParam, LPARAM lParam);
 
@@ -211,22 +265,22 @@
  *
  *	General shortcuts for variable names:
  *
- *	UINT l;		line
- *	UINT c;		column
- *	UINT s;		offset of selection start
- *	UINT e;		offset of selection end
- *	UINT sl;	line on which the selection starts
- *	UINT el;	line on which the selection ends
- *	UINT sc;	column on which the selection starts
- *	UINT ec;	column on which the selection ends
- *	UINT li;	line index (offset)
- *	UINT fv;	first visible line
- *	UINT vlc;	vissible line count
- *	UINT lc;	line count
- *	UINT lh;	line height (in pixels)
- *	UINT tw;	text width (in pixels)
- *	UINT ww;	window width (in pixels)
- *	UINT cw;	character width (average, in pixels)
+ *	INT32 l;	line
+ *	INT32 c;	column
+ *	INT32 s;	offset of selection start
+ *	INT32 e;	offset of selection end
+ *	INT32 sl;	line on which the selection starts
+ *	INT32 el;	line on which the selection ends
+ *	INT32 sc;	column on which the selection starts
+ *	INT32 ec;	column on which the selection ends
+ *	INT32 li;	line index (offset)
+ *	INT32 fv;	first visible line
+ *	INT32 vlc;	vissible line count
+ *	INT32 lc;	line count
+ *	INT32 lh;	line height (in pixels)
+ *	INT32 tw;	text width (in pixels)
+ *	INT32 ww;	window width (in pixels)
+ *	INT32 cw;	character width (average, in pixels)
  *
  */
 
@@ -235,255 +289,496 @@
  *
  *	EditWndProc()
  *
+ *	The messages are in the order of the actual integer values
+ *	(which can be found in include/windows.h)
+ *	Whereever possible the 16 bit versions are converted to
+ *	the 32 bit ones, so that we can 'fall through' to the
+ *	helper functions.  These are mostly 32 bit (with a few
+ *	exceptions, clearly indicated by a '16' extension to their
+ *	names).
+ *
  */
-LRESULT EditWndProc(HWND hwnd, UINT msg, WPARAM16 wParam, LPARAM lParam)
+LRESULT EditWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
 {
-	LRESULT lResult = 0L;
+	LRESULT lResult = 0;
 	WND *wndPtr = WIN_FindWndPtr(hwnd);
 
 	if ((!EDITSTATEPTR(wndPtr)) && (msg != WM_CREATE))
-		return DefWindowProc16(hwnd, msg, wParam, lParam);
+		return DefWindowProc32A(hwnd, msg, wParam, lParam);
 
 	switch (msg) {
-	case EM_CANUNDO:
-		DPRINTF_EDIT_MSG("EM_CANUNDO");
-		lResult = EDIT_EM_CanUndo(wndPtr, wParam, lParam);
-		break;
-	case EM_EMPTYUNDOBUFFER:
-		DPRINTF_EDIT_MSG("EM_EMPTYUNDOBUFFER");
-		lResult = EDIT_EM_EmptyUndoBuffer(wndPtr, wParam, lParam);
-		break;
-	case EM_FMTLINES:
-		DPRINTF_EDIT_MSG("EM_FMTLINES");
-		lResult = EDIT_EM_FmtLines(wndPtr, wParam, lParam);
-		break;
-	case EM_GETFIRSTVISIBLELINE:
-		DPRINTF_EDIT_MSG("EM_GETFIRSTVISIBLELINE");
-		lResult = EDIT_EM_GetFirstVisibleLine(wndPtr, wParam, lParam);
-		break;
-	case EM_GETHANDLE:
-		DPRINTF_EDIT_MSG("EM_GETHANDLE");
-		lResult = EDIT_EM_GetHandle(wndPtr, wParam, lParam);
-		break;
-	case EM_GETLINE:
-		DPRINTF_EDIT_MSG("EM_GETLINE");
-		lResult = EDIT_EM_GetLine(wndPtr, wParam, lParam);
-		break;
-	case EM_GETLINECOUNT:
-		DPRINTF_EDIT_MSG("EM_GETLINECOUNT");
-		lResult = EDIT_EM_GetLineCount(wndPtr, wParam, lParam);
-		break;
-	case EM_GETMODIFY:
-		DPRINTF_EDIT_MSG("EM_GETMODIFY");
-		lResult = EDIT_EM_GetModify(wndPtr, wParam, lParam);
-		break;
-	case EM_GETPASSWORDCHAR:
-		DPRINTF_EDIT_MSG("EM_GETPASSWORDCHAR");
-		lResult = EDIT_EM_GetPasswordChar(wndPtr, wParam, lParam);
-		break;
-	case EM_GETRECT:
-		DPRINTF_EDIT_MSG("EM_GETRECT");
-		lResult = EDIT_EM_GetRect(wndPtr, wParam, lParam);
-		break;
-	case EM_GETSEL:
-		DPRINTF_EDIT_MSG("EM_GETSEL");
+	case EM_GETSEL16:
+		DPRINTF_EDIT_MSG16("EM_GETSEL");
+		wParam = 0;
+		lParam = 0;
+		/* fall through */
+	case EM_GETSEL32:
+		DPRINTF_EDIT_MSG32("EM_GETSEL");
 		lResult = EDIT_EM_GetSel(wndPtr, wParam, lParam);
 		break;
-	case EM_GETTHUMB:
-		DPRINTF_EDIT_MSG("EM_GETTHUMB");
-		lResult = EDIT_EM_GetThumb(wndPtr, wParam, lParam);
+
+	case EM_SETSEL16:
+		DPRINTF_EDIT_MSG16("EM_SETSEL");
+		lResult = EDIT_EM_SetSel16(wndPtr, wParam, lParam);
 		break;
-	case EM_GETWORDBREAKPROC:
-		DPRINTF_EDIT_MSG("EM_GETWORDBREAKPROC");
-		lResult = EDIT_EM_GetWordBreakProc(wndPtr, wParam, lParam);
-		break;
-	case EM_LIMITTEXT:
-		DPRINTF_EDIT_MSG("EM_LIMITTEXT");
-		lResult = EDIT_EM_LimitText(wndPtr, wParam, lParam);
-		break;
-	case EM_LINEFROMCHAR:
-		DPRINTF_EDIT_MSG("EM_LINEFROMCHAR");
-		lResult = EDIT_EM_LineFromChar(wndPtr, wParam, lParam);
-		break;
-	case EM_LINEINDEX:
-		DPRINTF_EDIT_MSG("EM_LINEINDEX");
-		lResult = EDIT_EM_LineIndex(wndPtr, wParam, lParam);
-		break;
-	case EM_LINELENGTH:
-		DPRINTF_EDIT_MSG("EM_LINELENGTH");
-		lResult = EDIT_EM_LineLength(wndPtr, wParam, lParam);
-		break;
-	case EM_LINESCROLL:
-		DPRINTF_EDIT_MSG("EM_LINESCROLL");
-		lResult = EDIT_EM_LineScroll(wndPtr, wParam, lParam);
-		break;
-	case EM_REPLACESEL:
-		DPRINTF_EDIT_MSG("EM_REPLACESEL");
-		lResult = EDIT_EM_ReplaceSel(wndPtr, wParam, lParam);
-		break;
-	case EM_SCROLL:
-		DPRINTF_EDIT_MSG("EM_SCROLL");
-		lResult = EDIT_EM_Scroll(wndPtr, wParam, lParam);
- 		break;
-	case EM_SETHANDLE:
-		DPRINTF_EDIT_MSG("EM_SETHANDLE");
-		lResult = EDIT_EM_SetHandle(wndPtr, wParam, lParam);
-		break;
-	case EM_SETMODIFY:
-		DPRINTF_EDIT_MSG("EM_SETMODIFY");
-		lResult = EDIT_EM_SetModify(wndPtr, wParam, lParam);
-		break;
-	case EM_SETPASSWORDCHAR:
-		DPRINTF_EDIT_MSG("EM_SETPASSWORDCHAR");
-		lResult = EDIT_EM_SetPasswordChar(wndPtr, wParam, lParam);
-		break;
-	case EM_SETREADONLY:
-		DPRINTF_EDIT_MSG("EM_SETREADONLY");
-		lResult = EDIT_EM_SetReadOnly(wndPtr, wParam, lParam);
- 		break;
-	case EM_SETRECT:
-		DPRINTF_EDIT_MSG("EM_SETRECT");
-		lResult = EDIT_EM_SetRect(wndPtr, wParam, lParam);
-		break;
-	case EM_SETRECTNP:
-		DPRINTF_EDIT_MSG("EM_SETRECTNP");
-		lResult = EDIT_EM_SetRectNP(wndPtr, wParam, lParam);
-		break;
-	case EM_SETSEL:
-		DPRINTF_EDIT_MSG("EM_SETSEL");
+	case EM_SETSEL32:
+		DPRINTF_EDIT_MSG32("EM_SETSEL");
 		lResult = EDIT_EM_SetSel(wndPtr, wParam, lParam);
 		break;
-	case EM_SETTABSTOPS:
-		DPRINTF_EDIT_MSG("EM_SETTABSTOPS");
-		lResult = EDIT_EM_SetTabStops(wndPtr, wParam, lParam);
+
+	case EM_GETRECT16:
+		DPRINTF_EDIT_MSG16("EM_GETRECT");
+		lResult = EDIT_EM_GetRect16(wndPtr, wParam, lParam);
 		break;
-	case EM_SETWORDBREAKPROC:
-		DPRINTF_EDIT_MSG("EM_SETWORDBREAKPROC");
-		lResult = EDIT_EM_SetWordBreakProc(wndPtr, wParam, lParam);
+	case EM_GETRECT32:
+		DPRINTF_EDIT_MSG32("EM_GETRECT");
+		lResult = EDIT_EM_GetRect(wndPtr, wParam, lParam);
 		break;
-	case EM_UNDO:
+
+	case EM_SETRECT16:
+		DPRINTF_EDIT_MSG16("EM_SETRECT");
+		/* fall through */
+	case EM_SETRECT32:
+		DPRINTF_EDIT_MSG32("EM_SETRECT");
+		lResult = EDIT_EM_SetRect(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SETRECTNP16:
+		DPRINTF_EDIT_MSG16("EM_SETRECTNP");
+		/* fall through */
+	case EM_SETRECTNP32:
+		DPRINTF_EDIT_MSG32("EM_SETRECTNP");
+		lResult = EDIT_EM_SetRectNP(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SCROLL16:
+		DPRINTF_EDIT_MSG16("EM_SCROLL");
+		/* fall through */
+	case EM_SCROLL32:
+		DPRINTF_EDIT_MSG32("EM_SCROLL");
+		lResult = EDIT_EM_Scroll(wndPtr, wParam, lParam);
+ 		break;
+
+	case EM_LINESCROLL16:
+		DPRINTF_EDIT_MSG16("EM_LINESCROLL");
+		wParam = (WPARAM32)(INT32)(INT16)HIWORD(lParam);
+		lParam = (LPARAM)(INT32)(INT16)LOWORD(lParam);
+		/* fall through */
+	case EM_LINESCROLL32:
+		DPRINTF_EDIT_MSG32("EM_LINESCROLL");
+		lResult = EDIT_EM_LineScroll(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SCROLLCARET16:
+		DPRINTF_EDIT_MSG16("EM_SCROLLCARET");
+		/* fall through */
+	case EM_SCROLLCARET32:
+		DPRINTF_EDIT_MSG32("EM_SCROLLCARET");
+		lResult = EDIT_EM_ScrollCaret(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETMODIFY16:
+		DPRINTF_EDIT_MSG16("EM_GETMODIFY");
+		/* fall through */
+	case EM_GETMODIFY32:
+		DPRINTF_EDIT_MSG32("EM_GETMODIFY");
+		lResult = EDIT_EM_GetModify(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SETMODIFY16:
+		DPRINTF_EDIT_MSG16("EM_SETMODIFY");
+		/* fall through */
+	case EM_SETMODIFY32:
+		DPRINTF_EDIT_MSG32("EM_SETMODIFY");
+		lResult = EDIT_EM_SetModify(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETLINECOUNT16:
+		DPRINTF_EDIT_MSG16("EM_GETLINECOUNT");
+		/* fall through */
+	case EM_GETLINECOUNT32:
+		DPRINTF_EDIT_MSG32("EM_GETLINECOUNT");
+		lResult = EDIT_EM_GetLineCount(wndPtr, wParam, lParam);
+		break;
+
+	case EM_LINEINDEX16:
+		DPRINTF_EDIT_MSG16("EM_LINEINDEX");
+		/* fall through */
+	case EM_LINEINDEX32:
+		DPRINTF_EDIT_MSG32("EM_LINEINDEX");
+		lResult = EDIT_EM_LineIndex(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SETHANDLE16:
+		DPRINTF_EDIT_MSG16("EM_SETHANDLE");
+		lResult = EDIT_EM_SetHandle16(wndPtr, wParam, lParam);
+		break;
+	case EM_SETHANDLE32:
+		DPRINTF_EDIT_MSG32("EM_SETHANDLE");
+		lResult = EDIT_EM_SetHandle(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETHANDLE16:
+		DPRINTF_EDIT_MSG16("EM_GETHANDLE");
+		lResult = EDIT_EM_GetHandle16(wndPtr, wParam, lParam);
+		break;
+	case EM_GETHANDLE32:
+		DPRINTF_EDIT_MSG32("EM_GETHANDLE");
+		lResult = EDIT_EM_GetHandle(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETTHUMB16:
+		DPRINTF_EDIT_MSG16("EM_GETTHUMB");
+		/* fall through */
+	case EM_GETTHUMB32:
+		DPRINTF_EDIT_MSG32("EM_GETTHUMB");
+		lResult = EDIT_EM_GetThumb(wndPtr, wParam, lParam);
+		break;
+
+	/* messages 0x00bf and 0x00c0 missing from specs */
+
+	case WM_USER+15:
+		DPRINTF_EDIT_MSG16("undocumented WM_USER+15, please report");
+		/* fall through */
+	case 0x00bf:
+		DPRINTF_EDIT_MSG32("undocumented 0x00bf, please report");
+		lResult = DefWindowProc32A(hwnd, msg, wParam, lParam);
+		break;
+
+	case WM_USER+16:
+		DPRINTF_EDIT_MSG16("undocumented WM_USER+16, please report");
+		/* fall through */
+	case 0x00c0:
+		DPRINTF_EDIT_MSG32("undocumented 0x00c0, please report");
+		lResult = DefWindowProc32A(hwnd, msg, wParam, lParam);
+		break;
+
+	case EM_LINELENGTH16:
+		DPRINTF_EDIT_MSG16("EM_LINELENGTH");
+		/* fall through */
+	case EM_LINELENGTH32:
+		DPRINTF_EDIT_MSG32("EM_LINELENGTH");
+		lResult = EDIT_EM_LineLength(wndPtr, wParam, lParam);
+		break;
+
+	case EM_REPLACESEL16:
+		DPRINTF_EDIT_MSG16("EM_REPLACESEL");
+		lParam = (LPARAM)PTR_SEG_TO_LIN((SEGPTR)lParam);
+		/* fall through */
+	case EM_REPLACESEL32:
+		DPRINTF_EDIT_MSG32("EM_REPLACESEL");
+		lResult = EDIT_EM_ReplaceSel(wndPtr, wParam, lParam);
+		break;
+
+	/* message 0x00c3 missing from specs */
+
+	case WM_USER+19:
+		DPRINTF_EDIT_MSG16("undocumented WM_USER+19, please report");
+		/* fall through */
+	case 0x00c3:
+		DPRINTF_EDIT_MSG32("undocumented 0x00c3, please report");
+		lResult = DefWindowProc32A(hwnd, msg, wParam, lParam);
+		break;
+
+	case EM_GETLINE16:
+		DPRINTF_EDIT_MSG16("EM_GETLINE");
+		lParam = (LPARAM)PTR_SEG_TO_LIN((SEGPTR)lParam);
+		/* fall through */
+	case EM_GETLINE32:
+		DPRINTF_EDIT_MSG32("EM_GETLINE");
+		lResult = EDIT_EM_GetLine(wndPtr, wParam, lParam);
+		break;
+
+	case EM_LIMITTEXT16:
+		DPRINTF_EDIT_MSG16("EM_LIMITTEXT");
+		/* fall through */
+	case EM_SETLIMITTEXT32:
+		DPRINTF_EDIT_MSG32("EM_SETLIMITTEXT");
+		lResult = EDIT_EM_SetLimitText(wndPtr, wParam, lParam);
+		break;
+
+	case EM_CANUNDO16:
+		DPRINTF_EDIT_MSG16("EM_CANUNDO");
+		/* fall through */
+	case EM_CANUNDO32:
+		DPRINTF_EDIT_MSG32("EM_CANUNDO");
+		lResult = EDIT_EM_CanUndo(wndPtr, wParam, lParam);
+		break;
+
+	case EM_UNDO16:
+		DPRINTF_EDIT_MSG16("EM_UNDO");
+		/* fall through */
+	case EM_UNDO32:
+		/* fall through */
 	case WM_UNDO:
-		DPRINTF_EDIT_MSG("EM_UNDO / WM_UNDO");
+		DPRINTF_EDIT_MSG32("EM_UNDO / WM_UNDO");
 		lResult = EDIT_EM_Undo(wndPtr, wParam, lParam);
 		break;
+
+	case EM_FMTLINES16:
+		DPRINTF_EDIT_MSG16("EM_FMTLINES");
+		/* fall through */
+	case EM_FMTLINES32:
+		DPRINTF_EDIT_MSG32("EM_FMTLINES");
+		lResult = EDIT_EM_FmtLines(wndPtr, wParam, lParam);
+		break;
+
+	case EM_LINEFROMCHAR16:
+		DPRINTF_EDIT_MSG16("EM_LINEFROMCHAR");
+		/* fall through */
+	case EM_LINEFROMCHAR32:
+		DPRINTF_EDIT_MSG32("EM_LINEFROMCHAR");
+		lResult = EDIT_EM_LineFromChar(wndPtr, wParam, lParam);
+		break;
+
+	/* message 0x00ca missing from specs */
+
+	case WM_USER+26:
+		DPRINTF_EDIT_MSG16("undocumented WM_USER+26, please report");
+		/* fall through */
+	case 0x00ca:
+		DPRINTF_EDIT_MSG32("undocumented 0x00ca, please report");
+		lResult = DefWindowProc32A(hwnd, msg, wParam, lParam);
+		break;
+
+	case EM_SETTABSTOPS16:
+		DPRINTF_EDIT_MSG16("EM_SETTABSTOPS");
+		lResult = EDIT_EM_SetTabStops16(wndPtr, wParam, lParam);
+		break;
+	case EM_SETTABSTOPS32:
+		DPRINTF_EDIT_MSG32("EM_SETTABSTOPS");
+		lResult = EDIT_EM_SetTabStops(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SETPASSWORDCHAR16:
+		DPRINTF_EDIT_MSG16("EM_SETPASSWORDCHAR");
+		/* fall through */
+	case EM_SETPASSWORDCHAR32:
+		DPRINTF_EDIT_MSG32("EM_SETPASSWORDCHAR");
+		lResult = EDIT_EM_SetPasswordChar(wndPtr, wParam, lParam);
+		break;
+
+	case EM_EMPTYUNDOBUFFER16:
+		DPRINTF_EDIT_MSG16("EM_EMPTYUNDOBUFFER");
+		/* fall through */
+	case EM_EMPTYUNDOBUFFER32:
+		DPRINTF_EDIT_MSG32("EM_EMPTYUNDOBUFFER");
+		lResult = EDIT_EM_EmptyUndoBuffer(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETFIRSTVISIBLELINE16:
+		DPRINTF_EDIT_MSG16("EM_GETFIRSTVISIBLELINE");
+		/* fall through */
+	case EM_GETFIRSTVISIBLELINE32:
+		DPRINTF_EDIT_MSG32("EM_GETFIRSTVISIBLELINE");
+		lResult = EDIT_EM_GetFirstVisibleLine(wndPtr, wParam, lParam);
+		break;
+
+	case EM_SETREADONLY16:
+		DPRINTF_EDIT_MSG16("EM_SETREADONLY");
+		/* fall through */
+	case EM_SETREADONLY32:
+		DPRINTF_EDIT_MSG32("EM_SETREADONLY");
+		lResult = EDIT_EM_SetReadOnly(wndPtr, wParam, lParam);
+ 		break;
+
+	case EM_SETWORDBREAKPROC16:
+		DPRINTF_EDIT_MSG16("EM_SETWORDBREAKPROC");
+		/* fall through */
+	case EM_SETWORDBREAKPROC32:
+		DPRINTF_EDIT_MSG32("EM_SETWORDBREAKPROC");
+		lResult = EDIT_EM_SetWordBreakProc(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETWORDBREAKPROC16:
+		DPRINTF_EDIT_MSG16("EM_GETWORDBREAKPROC");
+		/* fall through */
+	case EM_GETWORDBREAKPROC32:
+		DPRINTF_EDIT_MSG32("EM_GETWORDBREAKPROC");
+		lResult = EDIT_EM_GetWordBreakProc(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETPASSWORDCHAR16:
+		DPRINTF_EDIT_MSG16("EM_GETPASSWORDCHAR");
+		/* fall through */
+	case EM_GETPASSWORDCHAR32:
+		DPRINTF_EDIT_MSG32("EM_GETPASSWORDCHAR");
+		lResult = EDIT_EM_GetPasswordChar(wndPtr, wParam, lParam);
+		break;
+
+	/* The following EM_xxx are new to win95 and don't exist for 16 bit */
+
+	case EM_SETMARGINS32:
+		DPRINTF_EDIT_MSG16("EM_SETMARGINS");
+		lResult = EDIT_EM_SetMargins(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETMARGINS32:
+		DPRINTF_EDIT_MSG16("EM_GETMARGINS");
+		lResult = EDIT_EM_GetMargins(wndPtr, wParam, lParam);
+		break;
+
+	case EM_GETLIMITTEXT32:
+		DPRINTF_EDIT_MSG16("EM_GETLIMITTEXT");
+		lResult = EDIT_EM_GetLimitText(wndPtr, wParam, lParam);
+		break;
+
+	case EM_POSFROMCHAR32:
+		DPRINTF_EDIT_MSG16("EM_POSFROMCHAR");
+		lResult = EDIT_EM_PosFromChar(wndPtr, wParam, lParam);
+		break;
+
+	case EM_CHARFROMPOS32:
+		DPRINTF_EDIT_MSG16("EM_CHARFROMPOS");
+		lResult = EDIT_EM_CharFromPos(wndPtr, wParam, lParam);
+		break;
+
 	case WM_GETDLGCODE:
-		DPRINTF_EDIT_MSG("WM_GETDLGCODE");
+		DPRINTF_EDIT_MSG32("WM_GETDLGCODE");
 		lResult = EDIT_WM_GetDlgCode(wndPtr, wParam, lParam);
 		break;
+
 	case WM_CHAR:
-		DPRINTF_EDIT_MSG("WM_CHAR");
+		DPRINTF_EDIT_MSG32("WM_CHAR");
 		lResult = EDIT_WM_Char(wndPtr, wParam, lParam);
 		break;
+
 	case WM_CLEAR:
-		DPRINTF_EDIT_MSG("WM_CLEAR");
+		DPRINTF_EDIT_MSG32("WM_CLEAR");
 		lResult = EDIT_WM_Clear(wndPtr, wParam, lParam);
 		break;
+
 	case WM_COPY:
-		DPRINTF_EDIT_MSG("WM_COPY");
+		DPRINTF_EDIT_MSG32("WM_COPY");
 		lResult = EDIT_WM_Copy(wndPtr, wParam, lParam);
 		break;
+
 	case WM_CREATE:
-		DPRINTF_EDIT_MSG("WM_CREATE");
+		DPRINTF_EDIT_MSG32("WM_CREATE");
 		lResult = EDIT_WM_Create(wndPtr, wParam, lParam);
 		break;
+
 	case WM_CUT:
-		DPRINTF_EDIT_MSG("WM_CUT");
+		DPRINTF_EDIT_MSG32("WM_CUT");
 		lResult = EDIT_WM_Cut(wndPtr, wParam, lParam);
 		break;
+
 	case WM_DESTROY:
-		DPRINTF_EDIT_MSG("WM_DESTROY");
+		DPRINTF_EDIT_MSG32("WM_DESTROY");
 		lResult = EDIT_WM_Destroy(wndPtr, wParam, lParam);
 		break;
+
 	case WM_ENABLE:
-		DPRINTF_EDIT_MSG("WM_ENABLE");
+		DPRINTF_EDIT_MSG32("WM_ENABLE");
 		lResult = EDIT_WM_Enable(wndPtr, wParam, lParam);
 		break;
+
 	case WM_ERASEBKGND:
-		DPRINTF_EDIT_MSG("WM_ERASEBKGND");
+		DPRINTF_EDIT_MSG32("WM_ERASEBKGND");
 		lResult = EDIT_WM_EraseBkGnd(wndPtr, wParam, lParam);
 		break;
+
 	case WM_GETFONT:
-		DPRINTF_EDIT_MSG("WM_GETFONT");
+		DPRINTF_EDIT_MSG32("WM_GETFONT");
 		lResult = EDIT_WM_GetFont(wndPtr, wParam, lParam);
 		break;
+
 	case WM_GETTEXT:
-		DPRINTF_EDIT_MSG("WM_GETTEXT");
+		DPRINTF_EDIT_MSG32("WM_GETTEXT");
 		lResult = EDIT_WM_GetText(wndPtr, wParam, lParam);
 		break;
+
 	case WM_GETTEXTLENGTH:
-		DPRINTF_EDIT_MSG("WM_GETTEXTLENGTH");
+		DPRINTF_EDIT_MSG32("WM_GETTEXTLENGTH");
 		lResult = EDIT_WM_GetTextLength(wndPtr, wParam, lParam);
 		break;
+
 	case WM_HSCROLL:
-		DPRINTF_EDIT_MSG("WM_HSCROLL");
+		DPRINTF_EDIT_MSG32("WM_HSCROLL");
 		lResult = EDIT_WM_HScroll(wndPtr, wParam, lParam);
 		break;
+
 	case WM_KEYDOWN:
-		DPRINTF_EDIT_MSG("WM_KEYDOWN");
+		DPRINTF_EDIT_MSG32("WM_KEYDOWN");
 		lResult = EDIT_WM_KeyDown(wndPtr, wParam, lParam);
 		break;
+
 	case WM_KILLFOCUS:
-		DPRINTF_EDIT_MSG("WM_KILLFOCUS");
+		DPRINTF_EDIT_MSG32("WM_KILLFOCUS");
 		lResult = EDIT_WM_KillFocus(wndPtr, wParam, lParam);
 		break;
+
 	case WM_LBUTTONDBLCLK:
-		DPRINTF_EDIT_MSG("WM_LBUTTONDBLCLK");
+		DPRINTF_EDIT_MSG32("WM_LBUTTONDBLCLK");
 		lResult = EDIT_WM_LButtonDblClk(wndPtr, wParam, lParam);
 		break;
+
 	case WM_LBUTTONDOWN:
-		DPRINTF_EDIT_MSG("WM_LBUTTONDOWN");
+		DPRINTF_EDIT_MSG32("WM_LBUTTONDOWN");
 		lResult = EDIT_WM_LButtonDown(wndPtr, wParam, lParam);
 		break;
+
 	case WM_LBUTTONUP:
-		DPRINTF_EDIT_MSG("WM_LBUTTONUP");
+		DPRINTF_EDIT_MSG32("WM_LBUTTONUP");
 		lResult = EDIT_WM_LButtonUp(wndPtr, wParam, lParam);
 		break;
+
 	case WM_MOUSEMOVE:
 		/*
-		 *	DPRINTF_EDIT_MSG("WM_MOUSEMOVE");
+		 *	DPRINTF_EDIT_MSG32("WM_MOUSEMOVE");
 		 */
 		lResult = EDIT_WM_MouseMove(wndPtr, wParam, lParam);
 		break;
+
 	case WM_PAINT:
-		DPRINTF_EDIT_MSG("WM_PAINT");
+		DPRINTF_EDIT_MSG32("WM_PAINT");
 		lResult = EDIT_WM_Paint(wndPtr, wParam, lParam);
 		break;
+
 	case WM_PASTE:
-		DPRINTF_EDIT_MSG("WM_PASTE");
+		DPRINTF_EDIT_MSG32("WM_PASTE");
 		lResult = EDIT_WM_Paste(wndPtr, wParam, lParam);
 		break;
+
 	case WM_SETCURSOR:
 		/*
-		 *	DPRINTF_EDIT_MSG("WM_SETCURSOR");
+		 *	DPRINTF_EDIT_MSG32("WM_SETCURSOR");
 		 */
 		lResult = EDIT_WM_SetCursor(wndPtr, wParam, lParam);
 		break;
+
 	case WM_SETFOCUS:
-		DPRINTF_EDIT_MSG("WM_SETFOCUS");
+		DPRINTF_EDIT_MSG32("WM_SETFOCUS");
 		lResult = EDIT_WM_SetFocus(wndPtr, wParam, lParam);
 		break;
+
 	case WM_SETFONT:
-		DPRINTF_EDIT_MSG("WM_SETFONT");
+		DPRINTF_EDIT_MSG32("WM_SETFONT");
 		lResult = EDIT_WM_SetFont(wndPtr, wParam, lParam);
 		break;
+
 	case WM_SETREDRAW:
-		DPRINTF_EDIT_MSG("WM_SETREDRAW");
+		DPRINTF_EDIT_MSG32("WM_SETREDRAW");
 		lResult = EDIT_WM_SetRedraw(wndPtr, wParam, lParam);
 		break;
+
 	case WM_SETTEXT:
-		DPRINTF_EDIT_MSG("WM_SETTEXT");
+		DPRINTF_EDIT_MSG32("WM_SETTEXT");
 		lResult = EDIT_WM_SetText(wndPtr, wParam, lParam);
 		break;
+
 	case WM_SIZE:
-		DPRINTF_EDIT_MSG("WM_SIZE");
+		DPRINTF_EDIT_MSG32("WM_SIZE");
 		lResult = EDIT_WM_Size(wndPtr, wParam, lParam);
 		break;
+
 	case WM_VSCROLL:
-		DPRINTF_EDIT_MSG("WM_VSCROLL");
+		DPRINTF_EDIT_MSG32("WM_VSCROLL");
 		lResult = EDIT_WM_VScroll(wndPtr, wParam, lParam);
 		break;
+
 	default:
-		lResult = DefWindowProc16(hwnd, msg, wParam, lParam);
+		lResult = DefWindowProc32A(hwnd, msg, wParam, lParam);
 		break;
 	}
 	EDIT_ReleasePointer(wndPtr);
@@ -503,28 +798,28 @@
 static void EDIT_BuildLineDefs(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	char *text = EDIT_GetPasswordPointer(wndPtr);
-	int ww = EDIT_GetWndWidth(wndPtr);
+	LPSTR text = EDIT_GetPasswordPointer(wndPtr);
+	INT32 ww = EDIT_GetWndWidth(wndPtr);
 	HDC32 hdc;
-	HFONT16 hFont;
+	HFONT32 hFont;
 	HFONT32 oldFont = 0;
-	char *start, *cp;
-	int prev, next;
-	int width;
-	int length;
+	LPSTR start, cp;
+	INT32 prev, next;
+	INT32 width;
+	INT32 length;
 	LINE_END ending;
 
 	hdc = GetDC32(wndPtr->hwndSelf);
-	hFont = (HFONT16)EDIT_WM_GetFont(wndPtr, 0, 0L);
+	hFont = (HFONT32)EDIT_WM_GetFont(wndPtr, 0, 0);
 	if (hFont) oldFont = SelectObject32(hdc, hFont);
 
 	if (!IsMultiLine(wndPtr)) {
 		es->LineCount = 1;
 		es->LineDefs = xrealloc(es->LineDefs, sizeof(LINEDEF));
 		es->LineDefs[0].offset = 0;
-		es->LineDefs[0].length = EDIT_WM_GetTextLength(wndPtr, 0, 0L);
+		es->LineDefs[0].length = EDIT_WM_GetTextLength(wndPtr, 0, 0);
 		es->LineDefs[0].ending = END_0;
-		es->TextWidth = LOWORD(GetTabbedTextExtent(hdc, text,
+		es->TextWidth = (INT32)LOWORD(GetTabbedTextExtent(hdc, text,
 					es->LineDefs[0].length,
 					es->NumTabStops, es->TabStops));
 	} else {
@@ -533,7 +828,7 @@
 		do {
 			if (!(cp = strstr(start, "\r\n"))) {
 				ending = END_0;
-				length = strlen(start);
+				length = lstrlen32A(start);
 			} else if ((cp > start) && (*(cp - 1) == '\r')) {
 				ending = END_SOFT;
 				length = cp - start - 1;
@@ -541,7 +836,7 @@
 				ending = END_HARD;
 				length = cp - start;
 			}
-			width = LOWORD(GetTabbedTextExtent(hdc, start, length,
+			width = (INT32)LOWORD(GetTabbedTextExtent(hdc, start, length,
 						es->NumTabStops, es->TabStops));
 
 			if (IsWordWrap(wndPtr) && (width > ww)) {
@@ -550,7 +845,7 @@
 					prev = next;
 					next = EDIT_CallWordBreakProc(wndPtr, start,
 							prev + 1, length, WB_RIGHT);
-					width = LOWORD(GetTabbedTextExtent(hdc, start, next,
+					width = (INT32)LOWORD(GetTabbedTextExtent(hdc, start, next,
 							es->NumTabStops, es->TabStops));
 				} while (width <= ww);
 				if (!prev) {
@@ -558,7 +853,7 @@
 					do {
 						prev = next;
 						next++;
-						width = LOWORD(GetTabbedTextExtent(hdc, start, next,
+						width = (INT32)LOWORD(GetTabbedTextExtent(hdc, start, next,
 								es->NumTabStops, es->TabStops));
 					} while (width <= ww);
 					if(!prev) prev = 1;
@@ -570,7 +865,7 @@
 					ending = END_DELIMIT;
 				} else
 					ending = END_NONE;
-				width = LOWORD(GetTabbedTextExtent(hdc, start, length,
+				width = (INT32)LOWORD(GetTabbedTextExtent(hdc, start, length,
 							es->NumTabStops, es->TabStops));
 			}
 
@@ -610,24 +905,28 @@
  *
  *	Call appropriate WordBreakProc (internal or external).
  *
+ *	FIXME: Heavily broken now that we have a LOCAL32 buffer.
+ *	External wordbreak functions have been disabled in
+ *	EM_SETWORDBREAKPROC.
+ *
  */
-static INT EDIT_CallWordBreakProc(WND *wndPtr, char *s, INT index, INT count, INT action)
+static INT32 EDIT_CallWordBreakProc(WND *wndPtr, LPSTR s, INT32 index, INT32 count, INT32 action)
 {
-    EDITWORDBREAKPROC wbp = (EDITWORDBREAKPROC)EDIT_EM_GetWordBreakProc(wndPtr, 0, 0L);
-
-    if (!wbp) return EDIT_WordBreakProc(s, index, count, action);
-    else
-    {
-        /* We need a SEGPTR here */
-
-        EDITSTATE *es = EDITSTATEPTR(wndPtr);
-        SEGPTR ptr = LOCAL_LockSegptr( wndPtr->hInstance, es->hBuf ) +
-                     (UINT16)(s - EDIT_GetPointer(wndPtr));
-        INT ret = CallWordBreakProc( (FARPROC16)wbp, ptr,
-                                     index, count, action);
-        LOCAL_Unlock( wndPtr->hInstance, es->hBuf );
-        return ret;
-    }
+	return EDIT_WordBreakProc(s, index, count, action);
+/*
+ *	EDITWORDBREAKPROC wbp = (EDITWORDBREAKPROC)EDIT_EM_GetWordBreakProc(wndPtr, 0, 0);
+ *
+ *	if (!wbp) return EDIT_WordBreakProc(s, index, count, action);
+ *	else {
+ *		EDITSTATE *es = EDITSTATEPTR(wndPtr);
+ *		SEGPTR ptr = LOCAL_LockSegptr( wndPtr->hInstance, es->hBuf16 ) +
+ *			(INT16)(s - EDIT_GetPointer(wndPtr));
+ *		INT ret = CallWordBreakProc( (FARPROC16)wbp, ptr,
+ *						index, count, action);
+ *		LOCAL_Unlock( wndPtr->hInstance, es->hBuf16 );
+ *		return ret;
+ *	}
+ */
 }
 
 
@@ -638,12 +937,12 @@
  *	Calculates, for a given line and X-coordinate on the screen, the column.
  *
  */
-static UINT EDIT_ColFromWndX(WND *wndPtr, UINT line, INT x)
-{	
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
-	UINT i;
+static INT32 EDIT_ColFromWndX(WND *wndPtr, INT32 line, INT32 x)
+{
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
+	INT32 li = (INT32)EDIT_EM_LineIndex(wndPtr, line, 0);
+	INT32 ll = (INT32)EDIT_EM_LineLength(wndPtr, li, 0);
+	INT32 i;
 
 	line = MAX(0, MIN(line, lc - 1));
 	for (i = 0 ; i < ll ; i++)
@@ -662,9 +961,9 @@
  */
 static void EDIT_DelEnd(WND *wndPtr)
 {
-	EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(-1, 0));
+	EDIT_EM_SetSel(wndPtr, -1, 0);
 	EDIT_MoveEnd(wndPtr, TRUE);
-	EDIT_WM_Clear(wndPtr, 0, 0L);
+	EDIT_WM_Clear(wndPtr, 0, 0);
 }
 
 
@@ -677,9 +976,9 @@
  */
 static void EDIT_DelLeft(WND *wndPtr)
 {
-	EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(-1, 0));
+	EDIT_EM_SetSel(wndPtr, -1, 0);
 	EDIT_MoveBackward(wndPtr, TRUE);
-	EDIT_WM_Clear(wndPtr, 0, 0L);
+	EDIT_WM_Clear(wndPtr, 0, 0);
 }
 
 
@@ -692,9 +991,9 @@
  */
 static void EDIT_DelRight(WND *wndPtr)
 {
-	EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(-1, 0));
+	EDIT_EM_SetSel(wndPtr, -1, 0);
 	EDIT_MoveForward(wndPtr, TRUE);
-	EDIT_WM_Clear(wndPtr, 0, 0L);
+	EDIT_WM_Clear(wndPtr, 0, 0);
 }
 
 
@@ -703,10 +1002,10 @@
  *	EDIT_GetAveCharWidth
  *
  */
-static UINT EDIT_GetAveCharWidth(WND *wndPtr)
+static INT32 EDIT_GetAveCharWidth(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
+
 	return es->AveCharWidth;
 }
 
@@ -716,10 +1015,10 @@
  *	EDIT_GetLineHeight
  *
  */
-static UINT EDIT_GetLineHeight(WND *wndPtr)
+static INT32 EDIT_GetLineHeight(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
+
 	return es->LineHeight;
 }
 
@@ -732,12 +1031,12 @@
  *	column to an ending column.
  *
  */
-static void EDIT_GetLineRect(WND *wndPtr, UINT line, UINT scol, UINT ecol, LPRECT16 rc)
+static void EDIT_GetLineRect(WND *wndPtr, INT32 line, INT32 scol, INT32 ecol, LPRECT32 rc)
 {
 	rc->top = EDIT_WndYFromLine(wndPtr, line);
 	rc->bottom = rc->top + EDIT_GetLineHeight(wndPtr);
 	rc->left = EDIT_WndXFromCol(wndPtr, line, scol);
-	rc->right = ((INT)ecol == -1) ? EDIT_GetWndWidth(wndPtr) :
+	rc->right = (ecol == -1) ? EDIT_GetWndWidth(wndPtr) :
 				EDIT_WndXFromCol(wndPtr, line, ecol);
 }
 
@@ -750,12 +1049,16 @@
  *	you can call it whenever you like, without unlocking.
  *
  */
-static char *EDIT_GetPointer(WND *wndPtr)
+static LPSTR EDIT_GetPointer(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
-	if (!es->text && es->hBuf)
-		es->text = LOCAL_Lock(wndPtr->hInstance, es->hBuf);
+
+	if (!es->text && (es->hBuf32 || es->hBuf16)) {
+		if (es->hBuf32)
+			es->text = (LPSTR)LocalLock32(es->hBuf32);
+		else
+			es->text = LOCAL_Lock(wndPtr->hInstance, es->hBuf16);
+	}
 	return es->text;
 }
 
@@ -766,11 +1069,11 @@
  *
  *
  */
-static char *EDIT_GetPasswordPointer(WND *wndPtr)
+static LPSTR EDIT_GetPasswordPointer(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	char *text = xstrdup(EDIT_GetPointer(wndPtr));
-	char *p;
+	LPSTR text = xstrdup(EDIT_GetPointer(wndPtr));
+	LPSTR p;
 
 	if(es->PasswordChar) {
 		p = text;
@@ -786,26 +1089,10 @@
 
 /*********************************************************************
  *
- *	EDIT_GetRect
- *
- *	Beware: This is not the function called on EM_GETRECT.
- *	It expects a (LPRECT) in lParam, not a (SEGPTR).
- *	It is used internally, as if there were no pointer difficulties.
- *
- */
-static LRESULT EDIT_GetRect(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-	GetClientRect16( wndPtr->hwndSelf, (LPRECT16)lParam );
-	return 0L;
-}
-
-
-/*********************************************************************
- *
  *	EDIT_GetRedraw
  *
  */
-static BOOL EDIT_GetRedraw(WND *wndPtr)
+static BOOL32 EDIT_GetRedraw(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
@@ -818,26 +1105,29 @@
  *	EDIT_GetSel
  *
  *	Beware: This is not the function called on EM_GETSEL.
- *	It returns the start in the low word and the end in the high word.
- *	NB s can be greater than e.
+ *	(because s can be greater than e).
  *
  */
-static LRESULT EDIT_GetSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+static void EDIT_GetSel(WND *wndPtr, LPINT32 s, LPINT32 e)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
-	return MAKELONG(es->SelStart, es->SelEnd);
+	if (s)
+		*s = es->SelStart;
+	if (e)
+		*e = es->SelEnd;
 }
 
+
 /*********************************************************************
  *
  *	EDIT_GetTextWidth
  *
  */
-static UINT EDIT_GetTextWidth(WND *wndPtr)
+static INT32 EDIT_GetTextWidth(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
+
 	return es->TextWidth;
 }
 
@@ -847,11 +1137,11 @@
  *	EDIT_GetVisibleLineCount
  *
  */
-static UINT EDIT_GetVisibleLineCount(WND *wndPtr)
+static INT32 EDIT_GetVisibleLineCount(WND *wndPtr)
 {
-	RECT16 rc;
-	
-	EDIT_GetRect(wndPtr, 0, (LPARAM)&rc);
+	RECT32 rc;
+
+	EDIT_EM_GetRect(wndPtr, 0, (LPARAM)&rc);
 	return MAX(1, MAX(rc.bottom - rc.top, 0) / EDIT_GetLineHeight(wndPtr));
 }
 
@@ -861,11 +1151,11 @@
  *	EDIT_GetWndWidth
  *
  */
-static UINT EDIT_GetWndWidth(WND *wndPtr)
+static INT32 EDIT_GetWndWidth(WND *wndPtr)
 {
-	RECT16 rc;
-	
-	EDIT_GetRect(wndPtr, 0, (LPARAM)&rc);
+	RECT32 rc;
+
+	EDIT_EM_GetRect(wndPtr, 0, (LPARAM)&rc);
 	return rc.right - rc.left;
 }
 
@@ -875,10 +1165,10 @@
  *	EDIT_GetXOffset
  *
  */
-static UINT EDIT_GetXOffset(WND *wndPtr)
+static INT32 EDIT_GetXOffset(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
+
 	return es->XOffset;
 }
 
@@ -894,64 +1184,64 @@
  *	start and end need not be ordered.
  *
  */
-static void EDIT_InvalidateText(WND *wndPtr, UINT start, UINT end)
+static void EDIT_InvalidateText(WND *wndPtr, INT32 start, INT32 end)
 {
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
-	UINT sl;
-	UINT el;
-	UINT sc;
-	UINT ec;
-	RECT16 rcWnd;
-	RECT16 rcLine;
-	RECT16 rcUpdate;
-	UINT l;
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT32 sl;
+	INT32 el;
+	INT32 sc;
+	INT32 ec;
+	RECT32 rcWnd;
+	RECT32 rcLine;
+	RECT32 rcUpdate;
+	INT32 l;
 
 	if (end == start )
 		return;
 
-	if ((INT)end == -1)
-		end = (UINT)EDIT_WM_GetTextLength(wndPtr, 0, 0L);
-	ORDER_UINT(start, end);
-	sl = (UINT)EDIT_EM_LineFromChar(wndPtr, start, 0L);
-	el = (UINT)EDIT_EM_LineFromChar(wndPtr, end, 0L);
+	if (end == -1)
+		end = (INT32)EDIT_WM_GetTextLength(wndPtr, 0, 0);
+	ORDER_INT32(start, end);
+	sl = (INT32)EDIT_EM_LineFromChar(wndPtr, start, 0);
+	el = (INT32)EDIT_EM_LineFromChar(wndPtr, end, 0);
 	if ((el < fv) || (sl > fv + vlc))
 		return;
 
-	sc = start - (UINT)EDIT_EM_LineIndex(wndPtr, sl, 0L);
-	ec = end - (UINT)EDIT_EM_LineIndex(wndPtr, el, 0L);
+	sc = start - (INT32)EDIT_EM_LineIndex(wndPtr, sl, 0);
+	ec = end - (INT32)EDIT_EM_LineIndex(wndPtr, el, 0);
 	if (sl < fv) {
 		sl = fv;
 		sc = 0;
 	}
 	if (el > fv + vlc) {
 		el = fv + vlc;
-		ec = (UINT)EDIT_EM_LineLength(wndPtr,
-				(UINT)EDIT_EM_LineIndex(wndPtr, el, 0L), 0L);
+		ec = (INT32)EDIT_EM_LineLength(wndPtr,
+				(INT32)EDIT_EM_LineIndex(wndPtr, el, 0), 0);
 	}
-	EDIT_GetRect(wndPtr, 0, (LPARAM)&rcWnd);
+	EDIT_EM_GetRect(wndPtr, 0, (LPARAM)&rcWnd);
 	if (sl == el) {
 		EDIT_GetLineRect(wndPtr, sl, sc, ec, &rcLine);
-		if (IntersectRect16(&rcUpdate, &rcWnd, &rcLine))
-			InvalidateRect16( wndPtr->hwndSelf, &rcUpdate, FALSE );
+		if (IntersectRect32(&rcUpdate, &rcWnd, &rcLine))
+			InvalidateRect32( wndPtr->hwndSelf, &rcUpdate, FALSE );
 	} else {
 		EDIT_GetLineRect(wndPtr, sl, sc,
-				(UINT)EDIT_EM_LineLength(wndPtr,
-					(UINT)EDIT_EM_LineIndex(wndPtr, sl, 0L), 0L),
+				(INT32)EDIT_EM_LineLength(wndPtr,
+					(INT32)EDIT_EM_LineIndex(wndPtr, sl, 0), 0),
 				&rcLine);
-		if (IntersectRect16(&rcUpdate, &rcWnd, &rcLine))
-			InvalidateRect16( wndPtr->hwndSelf, &rcUpdate, FALSE );
+		if (IntersectRect32(&rcUpdate, &rcWnd, &rcLine))
+			InvalidateRect32( wndPtr->hwndSelf, &rcUpdate, FALSE );
 		for (l = sl + 1 ; l < el ; l++) {
 			EDIT_GetLineRect(wndPtr, l, 0,
-				(UINT)EDIT_EM_LineLength(wndPtr,
-					(UINT)EDIT_EM_LineIndex(wndPtr, l, 0L), 0L),
+				(INT32)EDIT_EM_LineLength(wndPtr,
+					(INT32)EDIT_EM_LineIndex(wndPtr, l, 0), 0),
 				&rcLine);
-			if (IntersectRect16(&rcUpdate, &rcWnd, &rcLine))
-				InvalidateRect16(wndPtr->hwndSelf, &rcUpdate, FALSE);
+			if (IntersectRect32(&rcUpdate, &rcWnd, &rcLine))
+				InvalidateRect32(wndPtr->hwndSelf, &rcUpdate, FALSE);
 		}
 		EDIT_GetLineRect(wndPtr, el, 0, ec, &rcLine);
-		if (IntersectRect16(&rcUpdate, &rcWnd, &rcLine))
-			InvalidateRect16( wndPtr->hwndSelf, &rcUpdate, FALSE );
+		if (IntersectRect32(&rcUpdate, &rcWnd, &rcLine))
+			InvalidateRect32( wndPtr->hwndSelf, &rcUpdate, FALSE );
 	}
 }
 
@@ -963,11 +1253,11 @@
  *	Calculates, for a given Y-coordinate on the screen, the line.
  *
  */
-static UINT EDIT_LineFromWndY(WND *wndPtr, INT y)
+static INT32 EDIT_LineFromWndY(WND *wndPtr, INT32 y)
 {
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT lh = EDIT_GetLineHeight(wndPtr);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 lh = EDIT_GetLineHeight(wndPtr);
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
 
 	return MAX(0, MIN(lc - 1, y / lh + fv));
 }
@@ -980,9 +1270,11 @@
  *	Try to fit size + 1 bytes in the buffer.  Constrain to limits.
  *
  */
-static BOOL EDIT_MakeFit(WND *wndPtr, UINT size)
+static BOOL32 EDIT_MakeFit(WND *wndPtr, INT32 size)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+	HLOCAL32 hNew32;
+	HLOCAL16 hNew16;
 
 	if (size <= es->BufSize)
 		return TRUE;
@@ -994,11 +1286,33 @@
 
 	dprintf_edit(stddeb, "edit: EDIT_MakeFit: trying to ReAlloc to %d+1\n", size);
 
-	if (LOCAL_ReAlloc(wndPtr->hInstance, es->hBuf, size + 1, LMEM_MOVEABLE)) {
-		es->BufSize = MIN(LOCAL_Size(wndPtr->hInstance, es->hBuf) - 1, es->BufLimit);
-		return TRUE;
-	} else
-		return FALSE;
+	EDIT_ReleasePointer(wndPtr);
+	if (es->hBuf32) {
+		if ((hNew32 = LocalReAlloc32(es->hBuf32, size + 1, 0))) {
+			dprintf_edit(stddeb, "edit: EDIT_MakeFit: Old 32 bit handle %08x, new handle %08x\n", es->hBuf32, hNew32);
+			es->hBuf32 = hNew32;
+			es->BufSize = MIN(LocalSize32(es->hBuf32) - 1, es->BufLimit);
+			if (es->BufSize < size) {
+				dprintf_edit(stddeb, "edit: EDIT_MakeFit: FAILED !  We now have %d+1\n", es->BufSize);
+				return FALSE;
+			}
+			dprintf_edit(stddeb, "edit: EDIT_MakeFit: We now have %d+1\n", es->BufSize);
+			return TRUE;
+		}
+	} else {
+		if ((hNew16 = LOCAL_ReAlloc(wndPtr->hInstance, es->hBuf16, size + 1, LMEM_MOVEABLE))) {
+			dprintf_edit(stddeb, "edit: EDIT_MakeFit: Old 16 bit handle %08x, new handle %08x\n", es->hBuf16, hNew16);
+			es->hBuf16 = hNew16;
+			es->BufSize = MIN(LOCAL_Size(wndPtr->hInstance, es->hBuf16) - 1, es->BufLimit);
+			if (es->BufSize < size) {
+				dprintf_edit(stddeb, "edit: EDIT_MakeFit: FAILED !  We now have %d+1\n", es->BufSize);
+				return FALSE;
+			}
+			dprintf_edit(stddeb, "edit: EDIT_MakeFit: We now have %d+1\n", es->BufSize);
+			return TRUE;
+		}
+	}
+	return FALSE;
 }
 
 
@@ -1007,23 +1321,27 @@
  *	EDIT_MoveBackward
  *
  */
-static void EDIT_MoveBackward(WND *wndPtr, BOOL extend)
+static void EDIT_MoveBackward(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 li;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (e - li == 0) {
 		if (l) {
-			li = (UINT)EDIT_EM_LineIndex(wndPtr, l - 1, 0L);
-			e = li + (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
+			li = (INT32)EDIT_EM_LineIndex(wndPtr, l - 1, 0);
+			e = li + (INT32)EDIT_EM_LineLength(wndPtr, li, 0);
 		}
 	} else
 		e--;
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1032,24 +1350,29 @@
  *	EDIT_MoveDownward
  *
  */
-static void EDIT_MoveDownward(WND *wndPtr, BOOL extend)
+static void EDIT_MoveDownward(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	INT x;
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 lc;
+	INT32 li;
+	INT32 x;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	lc = (INT32)EDIT_EM_GetLineCount(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (l < lc - 1) {
 		x = EDIT_WndXFromCol(wndPtr, l, e - li);
 		l++;
-		e = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L) +
+		e = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0) +
 				EDIT_ColFromWndX(wndPtr, l, x);
 	}
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1058,18 +1381,23 @@
  *	EDIT_MoveEnd
  *
  */
-static void EDIT_MoveEnd(WND *wndPtr, BOOL extend)
+static void EDIT_MoveEnd(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 ll;
+	INT32 li;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	ll = (INT32)EDIT_EM_LineLength(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	e = li + ll;
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1078,23 +1406,29 @@
  *	EDIT_MoveForward
  *
  */
-static void EDIT_MoveForward(WND *wndPtr, BOOL extend)
+static void EDIT_MoveForward(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, e, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 lc;
+	INT32 ll;
+	INT32 li;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	lc = (INT32)EDIT_EM_GetLineCount(wndPtr, e, 0);
+	ll = (INT32)EDIT_EM_LineLength(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (e - li == ll) {
 		if (l != lc - 1)
-			e = (UINT)EDIT_EM_LineIndex(wndPtr, l + 1, 0L);
+			e = (INT32)EDIT_EM_LineIndex(wndPtr, l + 1, 0);
 	} else
 		e++;
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1105,17 +1439,21 @@
  *	Home key: move to beginning of line.
  *
  */
-static void EDIT_MoveHome(WND *wndPtr, BOOL extend)
+static void EDIT_MoveHome(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 li;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	e = li;
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1124,24 +1462,29 @@
  *	EDIT_MovePageDown
  *
  */
-static void EDIT_MovePageDown(WND *wndPtr, BOOL extend)
+static void EDIT_MovePageDown(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	INT x;
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 lc;
+	INT32 li;
+	INT32 x;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	lc = (INT32)EDIT_EM_GetLineCount(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (l < lc - 1) {
 		x = EDIT_WndXFromCol(wndPtr, l, e - li);
 		l = MIN(lc - 1, l + EDIT_GetVisibleLineCount(wndPtr));
-		e = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L) +
+		e = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0) +
 				EDIT_ColFromWndX(wndPtr, l, x);
 	}
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1150,23 +1493,27 @@
  *	EDIT_MovePageUp
  *
  */
-static void EDIT_MovePageUp(WND *wndPtr, BOOL extend)
+static void EDIT_MovePageUp(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	INT x;
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 li;
+	INT32 x;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (l) {
 		x = EDIT_WndXFromCol(wndPtr, l, e - li);
 		l = MAX(0, l - EDIT_GetVisibleLineCount(wndPtr));
-		e = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L) +
+		e = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0) +
 				EDIT_ColFromWndX(wndPtr, l, x);
 	}
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1175,23 +1522,27 @@
  *	EDIT_MoveUpward
  *
  */
-static void EDIT_MoveUpward(WND *wndPtr, BOOL extend)
+static void EDIT_MoveUpward(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	INT x;
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 li;
+	INT32 x;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (l) {
 		x = EDIT_WndXFromCol(wndPtr, l, e - li);
 		l--;
-		e = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L) +
+		e = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0) +
 				EDIT_ColFromWndX(wndPtr, l, x);
 	}
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1200,28 +1551,33 @@
  *	EDIT_MoveWordBackward
  *
  */
-static void EDIT_MoveWordBackward(WND *wndPtr, BOOL extend)
+static void EDIT_MoveWordBackward(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	char *text;
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 ll;
+	INT32 li;
+	LPSTR text;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	ll = (INT32)EDIT_EM_LineLength(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (e - li == 0) {
 		if (l) {
-			li = (UINT)EDIT_EM_LineIndex(wndPtr, l - 1, 0L);
-			e = li + (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
+			li = (INT32)EDIT_EM_LineIndex(wndPtr, l - 1, 0);
+			e = li + (INT32)EDIT_EM_LineLength(wndPtr, li, 0);
 		}
 	} else {
 		text = EDIT_GetPointer(wndPtr);
-		e = li + (UINT)EDIT_CallWordBreakProc(wndPtr,
+		e = li + (INT32)EDIT_CallWordBreakProc(wndPtr,
 				text + li, e - li, ll, WB_LEFT);
 	}
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1230,27 +1586,33 @@
  *	EDIT_MoveWordForward
  *
  */
-static void EDIT_MoveWordForward(WND *wndPtr, BOOL extend)
+static void EDIT_MoveWordForward(WND *wndPtr, BOOL32 extend)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, e, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	char *text;
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 lc;
+	INT32 ll;
+	INT32 li;
+	LPSTR text;
 
+	EDIT_GetSel(wndPtr, &s, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	lc = (INT32)EDIT_EM_GetLineCount(wndPtr, e, 0);
+	ll = (INT32)EDIT_EM_LineLength(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	if (e - li == ll) {
 		if (l != lc - 1)
-			e = (UINT)EDIT_EM_LineIndex(wndPtr, l + 1, 0L);
+			e = (INT32)EDIT_EM_LineIndex(wndPtr, l + 1, 0);
 	} else {
 		text = EDIT_GetPointer(wndPtr);
-		e = li + (UINT)EDIT_CallWordBreakProc(wndPtr,
+		e = li + EDIT_CallWordBreakProc(wndPtr,
 				text + li, e - li + 1, ll, WB_RIGHT);
 	}
 	if (!extend)
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 }
 
 
@@ -1259,17 +1621,17 @@
  *	EDIT_PaintLine
  *
  */
-static void EDIT_PaintLine(WND *wndPtr, HDC32 hdc, UINT line, BOOL rev)
+static void EDIT_PaintLine(WND *wndPtr, HDC32 hdc, INT32 line, BOOL32 rev)
 {
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	UINT li;
-	UINT ll;
-	UINT s;
-	UINT e;
-	INT x;
-	INT y;
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
+	INT32 li;
+	INT32 ll;
+	INT32 s;
+	INT32 e;
+	INT32 x;
+	INT32 y;
 
 	if ((line < fv) || (line > fv + vlc) || (line >= lc))
 		return;
@@ -1278,11 +1640,10 @@
 
 	x = EDIT_WndXFromCol(wndPtr, line, 0);
 	y = EDIT_WndYFromLine(wndPtr, line);
-	li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
-	ll = (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
-	s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	ORDER_UINT(s, e);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, line, 0);
+	ll = (INT32)EDIT_EM_LineLength(wndPtr, li, 0);
+	EDIT_GetSel(wndPtr, &s, &e);
+	ORDER_INT32(s, e);
 	s = MIN(li + ll, MAX(li, s));
 	e = MIN(li + ll, MAX(li, e));
 	if (rev && (s != e) &&
@@ -1301,15 +1662,15 @@
  *	EDIT_PaintText
  *
  */
-static UINT EDIT_PaintText(WND *wndPtr, HDC32 hdc, INT x, INT y, UINT line, UINT col, UINT count, BOOL rev)
+static INT32 EDIT_PaintText(WND *wndPtr, HDC32 hdc, INT32 x, INT32 y, INT32 line, INT32 col, INT32 count, BOOL32 rev)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 	COLORREF BkColor;
 	COLORREF TextColor;
-	UINT ret;
-	char *text;
-	UINT li;
-	UINT xoff;
+	INT32 ret;
+	LPSTR text;
+	INT32 li;
+	INT32 xoff;
 
 	if (!count)
 		return 0;
@@ -1320,9 +1681,9 @@
 		SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
 	}
 	text = EDIT_GetPasswordPointer(wndPtr);
-	li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, line, 0);
 	xoff = EDIT_GetXOffset(wndPtr);
-	ret = LOWORD(TabbedTextOut(hdc, x, y, text + li + col, count,
+	ret = (INT32)LOWORD(TabbedTextOut(hdc, x, y, text + li + col, count,
 					es->NumTabStops, es->TabStops, -xoff));
 	free(text);
 	if (rev) {
@@ -1330,7 +1691,7 @@
 		SetTextColor(hdc, TextColor);
 	}
 	return ret;
-}	
+}
 
 
 /*********************************************************************
@@ -1339,138 +1700,51 @@
  *
  *	This is the only helper function that can be called with es = NULL.
  *	It is called at the end of EditWndProc() to unlock the buffer.
- *	
+ *
  */
 static void EDIT_ReleasePointer(WND *wndPtr)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
+
 	if (!es)
 		return;
-	if (es->text && es->hBuf)
-		LOCAL_Unlock(wndPtr->hInstance, es->hBuf);
+	if (es->text && (es->hBuf32 || es->hBuf16))
+        {
+		if (es->hBuf32)
+			LocalUnlock32(es->hBuf32);
+		else
+			LOCAL_Unlock(wndPtr->hInstance, es->hBuf16);
+        }
 	es->text = NULL;
 }
 
 
 /*********************************************************************
  *
- *	EDIT_ReplaceSel
- *
- *	Beware: This is not the function called on EM_REPLACESEL.
- *	It expects a (char *) in lParam, not a (SEGPTR).
- *	It is used internally, as if there were no pointer difficulties.
- *
- */
-static LRESULT EDIT_ReplaceSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-	const char *str = (char *)lParam;
-	int strl = strlen(str);
-	UINT tl = (UINT)EDIT_WM_GetTextLength(wndPtr, 0, 0L);
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	int i;
-	char *p;
-	char *text;
-	BOOL redraw;
-
-	ORDER_UINT(s,e);
-	if (!EDIT_MakeFit(wndPtr, tl - (e - s) + strl)) {
-		EDIT_NOTIFY_PARENT(wndPtr, EN_MAXTEXT);
-		return 0L;
-	}
-	redraw = EDIT_GetRedraw(wndPtr);
-	EDIT_WM_SetRedraw(wndPtr, FALSE, 0L);
-	EDIT_WM_Clear(wndPtr, 0, 0L);
-	tl = EDIT_WM_GetTextLength(wndPtr, 0, 0L);
-	e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	text = EDIT_GetPointer(wndPtr);
-	for (p = text + tl ; p >= text + e ; p--)
-		p[strl] = p[0];
-	for (i = 0 , p = text + e ; i < strl ; i++)
-		p[i] = str[i];
-	if(IsUpper(wndPtr))
-		AnsiUpperBuff(p, strl);
-	else if(IsLower(wndPtr))
-		AnsiLowerBuff(p, strl);
-	EDIT_BuildLineDefs(wndPtr);
-	e += strl;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(e, e));
-	EDIT_EM_SetModify(wndPtr, TRUE, 0L);
-	EDIT_NOTIFY_PARENT(wndPtr, EN_UPDATE);
-	EDIT_WM_SetRedraw(wndPtr, redraw, 0L);
-	if (redraw) {
-		InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
-		EDIT_NOTIFY_PARENT(wndPtr, EN_CHANGE);
-	}
-	return 0L;
-}
- 
-
-/*********************************************************************
- *
- *	EDIT_ScrollIntoView
- *
- *	Makes sure the caret is visible.
- *
- */
-static void EDIT_ScrollIntoView(WND *wndPtr)
-{
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
-	UINT ww = EDIT_GetWndWidth(wndPtr);
-	UINT cw = EDIT_GetAveCharWidth(wndPtr);
-	INT x = EDIT_WndXFromCol(wndPtr, l, e - li);
-	int dy = 0;
-	int dx = 0;
-
-	if (l >= fv + vlc)
-		dy = l - vlc + 1 - fv;
-	if (l < fv)
-		dy = l - fv;
-	if (x < 0)
-		dx = x - ww / HSCROLL_FRACTION / cw * cw;
-	if (x > ww)
-		dx = x - (HSCROLL_FRACTION - 1) * ww / HSCROLL_FRACTION / cw * cw;
-	if (dy || dx) {
-		EDIT_EM_LineScroll(wndPtr, 0, MAKELPARAM(dy, dx));
-		if (dy) 
-			EDIT_NOTIFY_PARENT(wndPtr, EN_VSCROLL);
-		if (dx)
-			EDIT_NOTIFY_PARENT(wndPtr, EN_HSCROLL);
-	}
-}
-
-
-/*********************************************************************
- *
  *	EDIT_WndXFromCol
  *
  *	Calculates, for a given line and column, the X-coordinate on the screen.
  *
  */
-static INT EDIT_WndXFromCol(WND *wndPtr, UINT line, UINT col)
-{	
+static INT32 EDIT_WndXFromCol(WND *wndPtr, INT32 line, INT32 col)
+{
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	char *text = EDIT_GetPasswordPointer(wndPtr);
-	INT ret;
+	LPSTR text = EDIT_GetPasswordPointer(wndPtr);
+	INT32 ret;
 	HDC32 hdc;
-	HFONT16 hFont;
+	HFONT32 hFont;
 	HFONT32 oldFont = 0;
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, line, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, li, 0L);
-	UINT xoff = EDIT_GetXOffset(wndPtr);
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
+	INT32 li = (INT32)EDIT_EM_LineIndex(wndPtr, line, 0);
+	INT32 ll = (INT32)EDIT_EM_LineLength(wndPtr, li, 0);
+	INT32 xoff = EDIT_GetXOffset(wndPtr);
 
 	hdc = GetDC32(wndPtr->hwndSelf);
-	hFont = (HFONT16)EDIT_WM_GetFont(wndPtr, 0, 0L);
+	hFont = (HFONT32)EDIT_WM_GetFont(wndPtr, 0, 0);
 	if (hFont) oldFont = SelectObject32(hdc, hFont);
 	line = MAX(0, MIN(line, lc - 1));
 	col = MIN(col, ll);
-	ret = LOWORD(GetTabbedTextExtent(hdc,
+	ret = (INT32)LOWORD(GetTabbedTextExtent(hdc,
 			text + li, col,
 			es->NumTabStops, es->TabStops)) - xoff;
 	if (hFont) SelectObject32(hdc, oldFont);
@@ -1487,10 +1761,10 @@
  *	Calculates, for a given line, the Y-coordinate on the screen.
  *
  */
-static INT EDIT_WndYFromLine(WND *wndPtr, UINT line)
+static INT32 EDIT_WndYFromLine(WND *wndPtr, INT32 line)
 {
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT lh = EDIT_GetLineHeight(wndPtr);
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 lh = EDIT_GetLineHeight(wndPtr);
 
 	return (line - fv) * lh;
 }
@@ -1507,16 +1781,16 @@
  *		internally, so we can decide this for ourselves.
  *
  */
-static INT EDIT_WordBreakProc(char *s, INT index, INT count, INT action)
+static INT32 EDIT_WordBreakProc(LPSTR s, INT32 index, INT32 count, INT32 action)
 {
-	INT ret = 0;
+	INT32 ret = 0;
 
-	dprintf_edit(stddeb, "edit: EDIT_WordBreakProc: s=%p, index=%d"
-			", count=%d, action=%d\n", s, index, count, action);
+	dprintf_edit(stddeb, "edit: EDIT_WordBreakProc: s=%p, index=%u"
+			", count=%u, action=%d\n", s, index, count, action);
 
 	switch (action) {
 	case WB_LEFT:
-		if (!count) 
+		if (!count)
 			break;
 		if (index)
 			index--;
@@ -1569,7 +1843,38 @@
  */
 static LRESULT EDIT_EM_CanUndo(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	return 0L;
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	return (LRESULT)es->CanUndo;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_CHARFROMPOS
+ *
+ *	FIXME: do the specs mean LineIndex or LineNumber (li v.s. l) ???
+ */
+static LRESULT EDIT_EM_CharFromPos(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	POINT32 pt;
+	RECT32 rc;
+	INT32 l;
+	INT32 li;
+	INT32 c;
+
+	pt.x = LOWORD(lParam);
+	pt.y = HIWORD(lParam);
+	GetClientRect32(wndPtr->hwndSelf, &rc);
+
+	if (!PtInRect32(&rc, pt))
+		return -1;
+
+	l = EDIT_LineFromWndY(wndPtr, pt.y);
+	li = EDIT_EM_LineIndex(wndPtr, l, 0);
+	c = EDIT_ColFromWndX(wndPtr, l, pt.x);
+
+	return (LRESULT)MAKELONG(li + c, li);
 }
 
 
@@ -1580,7 +1885,10 @@
  */
 static LRESULT EDIT_EM_EmptyUndoBuffer(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	return 0L;
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	es->CanUndo = FALSE;
+	return 0;
 }
 
 
@@ -1591,8 +1899,8 @@
  */
 static LRESULT EDIT_EM_FmtLines(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	fprintf(stdnimp, "edit: EM_FMTLINES: message not implemented.\n");
-	return wParam ? -1L : 0L;
+	fprintf(stdnimp, "edit: EM_FMTLINES: message not implemented\n");
+	return wParam ? TRUE : FALSE;
 }
 
 
@@ -1604,8 +1912,11 @@
 static LRESULT EDIT_EM_GetFirstVisibleLine(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
-	return (LRESULT)es->FirstVisibleLine;
+
+	if (IsMultiLine(wndPtr))
+		return (LRESULT)es->FirstVisibleLine;
+	else
+		return (LRESULT)EDIT_ColFromWndX(wndPtr, 0, 0);
 }
 
 
@@ -1618,9 +1929,91 @@
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
-	return (LRESULT)es->hBuf;
+	if (!IsMultiLine(wndPtr))
+		return 0;
+
+	if (es->hBuf32)
+		return (LRESULT)es->hBuf32;
+	else
+		return (LRESULT)es->hBuf16;
 }
- 
+
+
+/*********************************************************************
+ *
+ *	EM_GETHANDLE16
+ *
+ *	Hopefully this won't fire back at us.
+ *	We always start with a buffer in 32 bit linear memory.
+ *	However, with this message a 16 bit application requests
+ *	a handle of 16 bit local heap memory, where it expects to find
+ *	the text.
+ *	It's a pitty that from this moment on we have to use this
+ *	local heap, because applications may rely on the handle
+ *	in the future.
+ *
+ *	In this function we'll try to switch to local heap.
+ */
+static LRESULT EDIT_EM_GetHandle16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+	LPSTR text;
+	HLOCAL16 newBuf;
+	LPSTR newText;
+	INT16 newSize;
+
+	if (!IsMultiLine(wndPtr))
+		return 0;
+
+	if (es->hBuf16)
+		return (LRESULT)es->hBuf16;
+
+	if (!LOCAL_HeapSize(wndPtr->hInstance)) {
+		if (!LocalInit(wndPtr->hInstance, 0,
+			       GlobalSize16(wndPtr->hInstance))) {
+			fprintf(stderr, "edit: EM_GETHANDLE: could not initialize local heap\n");
+			return 0;
+		}
+		dprintf_edit(stddeb, "edit: EM_GETHANDLE: local heap initialized\n");
+	}
+	if (!(newBuf = LOCAL_Alloc(wndPtr->hInstance,
+				EDIT_WM_GetTextLength(wndPtr, 0, 0) + 1,
+				LMEM_MOVEABLE))) {
+		fprintf(stderr, "edit: EM_GETHANDLE: could not allocate new 16 bit buffer\n");
+		return 0;
+	}
+	newSize = MIN(LOCAL_Size(wndPtr->hInstance, newBuf) - 1, es->BufLimit);
+	if (!(newText = LOCAL_Lock(wndPtr->hInstance, newBuf))) {
+		fprintf(stderr, "edit: EM_GETHANDLE: could not lock new 16 bit buffer\n");
+		LOCAL_Free(wndPtr->hInstance, newBuf);
+		return 0;
+	}
+	text = EDIT_GetPointer(wndPtr);
+	lstrcpy32A(newText, text);
+	EDIT_ReleasePointer(wndPtr);
+	GlobalFree32(es->hBuf32);
+	es->hBuf32 = (HLOCAL32)NULL;
+	es->hBuf16 = newBuf;
+	es->BufSize = newSize;
+	es->text = newText;
+	dprintf_edit(stddeb, "edit: EM_GETHANDLE: switched to 16 bit buffer\n");
+
+	return (LRESULT)es->hBuf16;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_GETLIMITTEXT
+ *
+ */
+static LRESULT EDIT_EM_GetLimitText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	return es->BufLimit;
+}
+
 
 /*********************************************************************
  *
@@ -1629,21 +2022,21 @@
  */
 static LRESULT EDIT_EM_GetLine(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	char *text;
-	char *src;
-	char *dst;
-	UINT len;
-	UINT i;
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	LPSTR text;
+	LPSTR src;
+	LPSTR dst;
+	INT32 len;
+	INT32 i;
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
 
 	if (!IsMultiLine(wndPtr))
 		wParam = 0;
-	if ((UINT)wParam >= lc)
-		return 0L;
+	if ((INT32)wParam >= lc)
+		return 0;
 	text = EDIT_GetPointer(wndPtr);
-	src = text + (UINT)EDIT_EM_LineIndex(wndPtr, wParam, 0L);
-	dst = (char *)PTR_SEG_TO_LIN(lParam);
-	len = MIN(*(WORD *)dst, (UINT)EDIT_EM_LineLength(wndPtr, wParam, 0L));
+	src = text + (INT32)EDIT_EM_LineIndex(wndPtr, wParam, 0);
+	dst = (LPSTR)lParam;
+	len = MIN(*(WORD *)dst, (INT32)EDIT_EM_LineLength(wndPtr, wParam, 0));
 	for (i = 0 ; i < len ; i++) {
 		*dst = *src;
 		src++;
@@ -1661,13 +2054,26 @@
 static LRESULT EDIT_EM_GetLineCount(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	
+
 	return (LRESULT)es->LineCount;
 }
 
 
 /*********************************************************************
  *
+ *	EM_GETMARGINS
+ *
+ */
+static LRESULT EDIT_EM_GetMargins(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	return (LRESULT)MAKELONG(es->LeftMargin, es->RightMargin);
+}
+
+
+/*********************************************************************
+ *
  *	EM_GETMODIFY
  *
  */
@@ -1699,7 +2105,24 @@
  */
 static LRESULT EDIT_EM_GetRect(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	return EDIT_GetRect(wndPtr, wParam, (LPARAM)PTR_SEG_TO_LIN(lParam));
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	CopyRect32((LPRECT32)lParam, &es->FormatRect);
+	return 0;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_GETRECT16
+ *
+ */
+static LRESULT EDIT_EM_GetRect16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	CONV_RECT32TO16(&es->FormatRect, (LPRECT16)PTR_SEG_TO_LIN((SEGPTR)lParam));
+	return 0;
 }
 
 
@@ -1713,11 +2136,16 @@
  */
 static LRESULT EDIT_EM_GetSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
+	INT32 s;
+	INT32 e;
 
-	ORDER_UINT(s, e);
-	return MAKELONG(s, e);
+	EDIT_GetSel(wndPtr, &s, &e);
+	ORDER_INT32(s, e);
+	if (wParam)
+		*(LPINT32)wParam = s;
+	if (lParam)
+		*(LPINT32)lParam = e;
+	return MAKELONG((INT16)s, (INT16)e);
 }
 
 
@@ -1725,13 +2153,16 @@
  *
  *	EM_GETTHUMB
  *
- *	FIXME: undocumented: is this right ?
+ *	FIXME: is this right ?  (or should it be only HSCROLL)
+ *	(and maybe only for edit controls that really have their
+ *	own scrollbars) (and maybe only for multiline controls ?)
+ *	All in all: very poorly documented
  *
  */
 static LRESULT EDIT_EM_GetThumb(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	return MAKELONG(EDIT_WM_VScroll(wndPtr, EM_GETTHUMB, 0L),
-		EDIT_WM_HScroll(wndPtr, EM_GETTHUMB, 0L));
+	return MAKELONG(EDIT_WM_VScroll(wndPtr, EM_GETTHUMB16, 0),
+		EDIT_WM_HScroll(wndPtr, EM_GETTHUMB16, 0));
 }
 
 
@@ -1739,36 +2170,17 @@
  *
  *	EM_GETWORDBREAKPROC
  *
+ *	FIXME: Application defined WordBreakProc should be returned
+ *
  */
 static LRESULT EDIT_EM_GetWordBreakProc(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
+/*
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
 	return (LRESULT)es->WordBreakProc;
-}
-
-
-/*********************************************************************
- *
- *	EM_LIMITTEXT
- *
- */
-static LRESULT EDIT_EM_LimitText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
-{
-	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-
-	if (IsMultiLine(wndPtr)) {
-		if (wParam)
-			es->BufLimit = MIN((UINT)wParam, BUFLIMIT_MULTI);
-		else
-			es->BufLimit = BUFLIMIT_MULTI;
-	} else {
-		if (wParam)
-			es->BufLimit = MIN((UINT)wParam, BUFLIMIT_SINGLE);
-		else
-			es->BufLimit = BUFLIMIT_SINGLE;
-	}
-	return 0L;
+*/
+	return 0;
 }
 
 
@@ -1779,14 +2191,14 @@
  */
 static LRESULT EDIT_EM_LineFromChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT l;
+	INT32 l;
 
 	if (!IsMultiLine(wndPtr))
-		return 0L;
-	if ((INT)wParam == -1)
-		wParam = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	l = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L) - 1;
-	while ((UINT)EDIT_EM_LineIndex(wndPtr, l, 0L) > (UINT)wParam)
+		return 0;
+	if ((INT32)wParam == -1)
+		EDIT_EM_GetSel(wndPtr, (WPARAM32)&wParam, 0);	/* intentional (looks weird, doesn't it ?) */
+	l = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0) - 1;
+	while ((INT32)EDIT_EM_LineIndex(wndPtr, l, 0) > (INT32)wParam)
 		l--;
 	return (LRESULT)l;
 }
@@ -1800,20 +2212,20 @@
 static LRESULT EDIT_EM_LineIndex(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	UINT e;
-	UINT l;
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
+	INT32 e;
+	INT32 l;
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
 
-	if ((INT)wParam == -1) {
-		e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
+	if ((INT32)wParam == -1) {
+		EDIT_GetSel(wndPtr, NULL, &e);
 		l = lc - 1;
 		while (es->LineDefs[l].offset > e)
 			l--;
 		return (LRESULT)es->LineDefs[l].offset;
 	}
-	if ((UINT)wParam >= lc)
-		return -1L;
-	return (LRESULT)es->LineDefs[(UINT)wParam].offset;
+	if ((INT32)wParam >= lc)
+		return -1;
+	return (LRESULT)es->LineDefs[(INT32)wParam].offset;
 }
 
 
@@ -1825,43 +2237,47 @@
 static LRESULT EDIT_EM_LineLength(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	UINT s;
-	UINT e;
-	UINT sl;
-	UINT el;
+	INT32 s;
+	INT32 e;
+	INT32 sl;
+	INT32 el;
 
 	if (!IsMultiLine(wndPtr))
 		return (LRESULT)es->LineDefs[0].length;
-	if ((INT)wParam == -1) {
-		s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-		e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-		sl = (UINT)EDIT_EM_LineFromChar(wndPtr, s, 0L);
-		el = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
+	if ((INT32)wParam == -1) {
+		EDIT_GetSel(wndPtr, &s, &e);
+		sl = (INT32)EDIT_EM_LineFromChar(wndPtr, s, 0);
+		el = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
 		return (LRESULT)(s - es->LineDefs[sl].offset +
 				es->LineDefs[el].offset +
 				es->LineDefs[el].length - e);
 	}
-	return (LRESULT)es->LineDefs[(UINT)EDIT_EM_LineFromChar(wndPtr, wParam, 0L)].length;
+	return (LRESULT)es->LineDefs[(INT32)EDIT_EM_LineFromChar(wndPtr, wParam, 0)].length;
 }
- 
+
 
 /*********************************************************************
  *
  *	EM_LINESCROLL
  *
+ *	FIXME: is wParam in pixels or in average character widths ???
+ *	FIXME: we use this internally to scroll single line controls as well
+ *	(specs are vague about whether this message is valid or not for
+ *	single line controls)
+ *
  */
 static LRESULT EDIT_EM_LineScroll(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT nfv = MAX(0, fv + (INT)LOWORD(lParam));
-	UINT xoff = EDIT_GetXOffset(wndPtr);
-	UINT nxoff = MAX(0, xoff + (INT)HIWORD(lParam));
-	UINT tw = EDIT_GetTextWidth(wndPtr);
-	INT dx;
-	INT dy;
-	POINT16 pos;
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 nfv = MAX(0, fv + (INT32)lParam);
+	INT32 xoff = EDIT_GetXOffset(wndPtr);
+	INT32 nxoff = MAX(0, xoff + (INT32)wParam);
+	INT32 tw = EDIT_GetTextWidth(wndPtr);
+	INT32 dx;
+	INT32 dy;
+	POINT32 pos;
 
 	if (nfv >= lc)
 		nfv = lc - 1;
@@ -1873,23 +2289,45 @@
 	if (dx || dy) {
 		if (wndPtr->hwndSelf == GetFocus32())
 			HideCaret(wndPtr->hwndSelf);
-		if (EDIT_GetRedraw(wndPtr)) 
+		if (EDIT_GetRedraw(wndPtr))
 			ScrollWindow32(wndPtr->hwndSelf, dx, dy, NULL, NULL);
 		es->FirstVisibleLine = nfv;
 		es->XOffset = nxoff;
 		if (IsVScrollBar(wndPtr))
 			SetScrollPos32(wndPtr->hwndSelf, SB_VERT,
-				EDIT_WM_VScroll(wndPtr, EM_GETTHUMB, 0L), TRUE);
+				EDIT_WM_VScroll(wndPtr, EM_GETTHUMB16, 0), TRUE);
 		if (IsHScrollBar(wndPtr))
 			SetScrollPos32(wndPtr->hwndSelf, SB_HORZ,
-				EDIT_WM_HScroll(wndPtr, EM_GETTHUMB, 0L), TRUE);
+				EDIT_WM_HScroll(wndPtr, EM_GETTHUMB16, 0), TRUE);
 		if (wndPtr->hwndSelf == GetFocus32()) {
-			GetCaretPos16(&pos);
+			GetCaretPos32(&pos);
 			SetCaretPos(pos.x + dx, pos.y + dy);
 			ShowCaret(wndPtr->hwndSelf);
 		}
 	}
-	return -1L;
+	if (IsMultiLine(wndPtr))
+		return TRUE;
+	else
+		return FALSE;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_POSFROMCHAR
+ *
+ */
+static LRESULT EDIT_EM_PosFromChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	INT32 len = (INT32)EDIT_WM_GetTextLength(wndPtr, 0, 0);
+	INT32 l;
+	INT32 li;
+
+	wParam = MIN(wParam, len);
+	l = EDIT_EM_LineFromChar(wndPtr, wParam, 0);
+	li = EDIT_EM_LineIndex(wndPtr, l, 0);
+	return (LRESULT)MAKELONG(EDIT_WndXFromCol(wndPtr, l, wParam - li),
+				EDIT_WndYFromLine(wndPtr, l));
 }
 
 
@@ -1897,25 +2335,120 @@
  *
  *	EM_REPLACESEL
  *
+ *	FIXME: wParam indicates whether we should maintain an undo buffer
+ *	for this operation.
+ *
  */
 static LRESULT EDIT_EM_ReplaceSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	return (LRESULT)EDIT_ReplaceSel(wndPtr, wParam,
-				(LPARAM)(char *)PTR_SEG_TO_LIN(lParam));
+	LPCSTR str = (LPCSTR)lParam;
+	INT32 strl = lstrlen32A(str);
+	INT32 tl = (INT32)EDIT_WM_GetTextLength(wndPtr, 0, 0);
+	INT32 s;
+	INT32 e;
+	INT32 i;
+	LPSTR p;
+	LPSTR text;
+	BOOL32 redraw;
+
+	EDIT_GetSel(wndPtr, &s, &e);
+	ORDER_INT32(s,e);
+	if (!EDIT_MakeFit(wndPtr, tl - (e - s) + strl)) {
+		dprintf_edit(stddeb, "edit: notification EN_MAXTEXT sent\n");
+		EDIT_NOTIFY_PARENT(wndPtr, EN_MAXTEXT);
+		return 0;
+	}
+	redraw = EDIT_GetRedraw(wndPtr);
+	EDIT_WM_SetRedraw(wndPtr, FALSE, 0);
+	EDIT_WM_Clear(wndPtr, 0, 0);
+	tl = EDIT_WM_GetTextLength(wndPtr, 0, 0);
+	EDIT_GetSel(wndPtr, NULL, &e);
+	text = EDIT_GetPointer(wndPtr);
+	for (p = text + tl ; p >= text + e ; p--)
+		p[strl] = p[0];
+	for (i = 0 , p = text + e ; i < strl ; i++)
+		p[i] = str[i];
+	if(IsUpper(wndPtr))
+		CharUpperBuff32A(p, strl);
+	else if(IsLower(wndPtr))
+		CharLowerBuff32A(p, strl);
+	EDIT_BuildLineDefs(wndPtr);
+	e += strl;
+	EDIT_EM_SetSel(wndPtr, e, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+	EDIT_EM_SetModify(wndPtr, TRUE, 0);
+	dprintf_edit(stddeb, "edit: notification EN_UPDATE sent\n");
+	EDIT_NOTIFY_PARENT(wndPtr, EN_UPDATE);
+	EDIT_WM_SetRedraw(wndPtr, redraw, 0);
+	if (redraw) {
+		InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
+		dprintf_edit(stddeb, "edit: notification EN_CHANGE sent\n");
+		EDIT_NOTIFY_PARENT(wndPtr, EN_CHANGE);
+	}
+	return 0;
 }
- 
+
 
 /*********************************************************************
  *
  *	EM_SCROLL
  *
- *	FIXME: undocumented message.
+ *	FIXME: Scroll what ???  And where ???
  *
  */
 static LRESULT EDIT_EM_Scroll(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	fprintf(stdnimp, "edit: EM_SCROLL: message not implemented (undocumented), please report.\n");
-	return 0L;
+	fprintf(stdnimp, "edit: EM_SCROLL: message not implemented\n");
+	return 0;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_SCROLLCARET
+ *
+ *	Makes sure the caret is visible.
+ *	FIXME: We use EM_LINESCROLL, but may we do that for single line
+ *		controls ???
+ *
+ */
+static LRESULT EDIT_EM_ScrollCaret(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	INT32 e;
+	INT32 l;
+	INT32 li;
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT32 ww = EDIT_GetWndWidth(wndPtr);
+	INT32 cw = EDIT_GetAveCharWidth(wndPtr);
+	INT32 x;
+	INT32 dy = 0;
+	INT32 dx = 0;
+
+	EDIT_GetSel(wndPtr, NULL, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
+	x = EDIT_WndXFromCol(wndPtr, l, e - li);
+	if (l >= fv + vlc)
+		dy = l - vlc + 1 - fv;
+	if (l < fv)
+		dy = l - fv;
+	if (x < 0)
+		dx = x - ww / HSCROLL_FRACTION / cw * cw;
+	if (x > ww)
+		dx = x - (HSCROLL_FRACTION - 1) * ww / HSCROLL_FRACTION / cw * cw;
+	if (dy || dx) {
+		EDIT_EM_LineScroll(wndPtr, dx, dy);
+		if (dy) {
+			dprintf_edit(stddeb, "edit: notification EN_VSCROLL sent\n");
+			EDIT_NOTIFY_PARENT(wndPtr, EN_VSCROLL);
+		}
+		if (dx) {
+			dprintf_edit(stddeb, "edit: notification EN_HSCROLL sent\n");
+			EDIT_NOTIFY_PARENT(wndPtr, EN_HSCROLL);
+		}
+	}
+	return TRUE;
 }
 
 
@@ -1933,19 +2466,105 @@
 		/*
 		 *	old buffer is freed by caller
 		 */
-		es->hBuf = (HLOCAL16)wParam;
-		es->BufSize = LOCAL_Size(wndPtr->hInstance, es->hBuf) - 1;
+		es->hBuf16 = (HLOCAL16)NULL;
+		es->hBuf32 = (HLOCAL32)wParam;
+		es->BufSize = LocalSize32(es->hBuf32) - 1;
 		es->LineCount = 0;
 		es->FirstVisibleLine = 0;
 		es->SelStart = es->SelEnd = 0;
-		EDIT_EM_EmptyUndoBuffer(wndPtr, 0, 0L);
-		EDIT_EM_SetModify(wndPtr, FALSE, 0L);
+		EDIT_EM_EmptyUndoBuffer(wndPtr, 0, 0);
+		EDIT_EM_SetModify(wndPtr, FALSE, 0);
 		EDIT_BuildLineDefs(wndPtr);
 		if (EDIT_GetRedraw(wndPtr))
 			InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
-		EDIT_ScrollIntoView(wndPtr);
+		EDIT_EM_ScrollCaret(wndPtr, 0, 0);
 	}
-	return 0L;
+	return 0;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_SETHANDLE16
+ *
+ */
+static LRESULT EDIT_EM_SetHandle16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	if (IsMultiLine(wndPtr)) {
+		EDIT_ReleasePointer(wndPtr);
+		/*
+		 *	old buffer is freed by caller
+		 */
+		es->hBuf16 = (HLOCAL16)wParam;
+		es->hBuf32 = (HLOCAL32)NULL;
+		es->BufSize = LOCAL_Size(wndPtr->hInstance, es->hBuf16) - 1;
+		es->LineCount = 0;
+		es->FirstVisibleLine = 0;
+		es->SelStart = es->SelEnd = 0;
+		EDIT_EM_EmptyUndoBuffer(wndPtr, 0, 0);
+		EDIT_EM_SetModify(wndPtr, FALSE, 0);
+		EDIT_BuildLineDefs(wndPtr);
+		if (EDIT_GetRedraw(wndPtr))
+			InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
+		EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+	}
+	return 0;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_SETLIMITTEXT
+ *
+ */
+static LRESULT EDIT_EM_SetLimitText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	if (IsMultiLine(wndPtr)) {
+		if (wParam)
+			es->BufLimit = MIN((INT32)wParam, BUFLIMIT_MULTI);
+		else
+			es->BufLimit = BUFLIMIT_MULTI;
+	} else {
+		if (wParam)
+			es->BufLimit = MIN((INT32)wParam, BUFLIMIT_SINGLE);
+		else
+			es->BufLimit = BUFLIMIT_SINGLE;
+	}
+	return 0;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_SETMARGINS
+ *
+ *	FIXME: We let the margins be set, but we don't use them yet !?!
+ *
+ */
+static LRESULT EDIT_EM_SetMargins(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	if (wParam & EC_USEFONTINFO) {
+		if (IsMultiLine(wndPtr)) {
+			/*
+			 *	FIXME: do some GetABCCharWidth, or so
+			 *		This is just preliminary
+			 */
+			es->LeftMargin = es->RightMargin = EDIT_GetAveCharWidth(wndPtr);
+		} else
+			es->LeftMargin = es->RightMargin = EDIT_GetAveCharWidth(wndPtr);
+		return 0;
+	}
+	if (wParam & EC_LEFTMARGIN)
+		es->LeftMargin = LOWORD(lParam);
+	if (wParam & EC_RIGHTMARGIN)
+		es->RightMargin = HIWORD(lParam);
+	return 0;
 }
 
 
@@ -1958,8 +2577,8 @@
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
-	es->TextChanged = (BOOL)wParam;
-	return 0L;
+	es->TextChanged = (BOOL32)wParam;
+	return 0;
 }
 
 
@@ -1967,13 +2586,15 @@
  *
  *	EM_SETPASSWORDCHAR
  *
+ *	FIXME: This imlementation is way too simple
+ *
  */
 static LRESULT EDIT_EM_SetPasswordChar(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
-	es->PasswordChar = (char)wParam;
-	return 0L;
+	es->PasswordChar = (CHAR)wParam;
+	return 0;
 }
 
 
@@ -1984,11 +2605,11 @@
  */
 static LRESULT EDIT_EM_SetReadOnly(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	if ((BOOL)wParam)
+	if ((BOOL32)wParam)
 		wndPtr->dwStyle |= ES_READONLY;
 	else
 		wndPtr->dwStyle &= ~(DWORD)ES_READONLY;
-	return 0L;
+	return TRUE;
 }
 
 
@@ -1999,8 +2620,8 @@
  */
 static LRESULT EDIT_EM_SetRect(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	fprintf(stdnimp,"edit: EM_SETRECT: message not implemented, please report.\n");
-	return 0L;
+	fprintf(stdnimp,"edit: EM_SETRECT: message not implemented\n");
+	return 0;
 }
 
 
@@ -2011,8 +2632,8 @@
  */
 static LRESULT EDIT_EM_SetRectNP(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	fprintf(stdnimp,"edit: EM_SETRECTNP: message not implemented, please report.\n");
-	return 0L;
+	fprintf(stdnimp,"edit: EM_SETRECTNP: message not implemented\n");
+	return 0;
 }
 
 
@@ -2020,50 +2641,76 @@
  *
  *	EM_SETSEL
  *
+ *	FIXME: specs state that we should order start and end.
+ *		However, we use internally that this is not the case.
+ *
  */
 static LRESULT EDIT_EM_SetSel(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	UINT ns = LOWORD(lParam);
-	UINT ne = HIWORD(lParam);
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT el;
-	UINT eli;
-	UINT tl = (UINT)EDIT_WM_GetTextLength(wndPtr, 0, 0L);
+	INT32 ns = (INT32)wParam;
+	INT32 ne = (INT32)lParam;
+	INT32 s;
+	INT32 e;
+	INT32 el;
+	INT32 eli;
+	INT32 tl = (INT32)EDIT_WM_GetTextLength(wndPtr, 0, 0);
 
-	if ((INT)ns == -1) {
+	EDIT_GetSel(wndPtr, &s, &e);
+	if (ns == -1) {
 		ns = e;
 		ne = e;
 	}
-	else {
-		ns = MIN(ns, tl);
-		ne = MIN(ne, tl);
-	}
+	if (ne == -1)
+		ne = e;
+/*
+	ORDER_INT32(ns, ne);
+*/
+	ns = MIN(ns, tl);
+	ne = MIN(ne, tl);
 	es->SelStart = ns;
 	es->SelEnd = ne;
 	if (wndPtr->hwndSelf == GetFocus32()) {
-		el = (UINT)EDIT_EM_LineFromChar(wndPtr, ne, 0L);
-		eli = (UINT)EDIT_EM_LineIndex(wndPtr, el, 0L);
+		el = (INT32)EDIT_EM_LineFromChar(wndPtr, ne, 0);
+		eli = (INT32)EDIT_EM_LineIndex(wndPtr, el, 0);
 		SetCaretPos(EDIT_WndXFromCol(wndPtr, el, ne - eli),
 				EDIT_WndYFromLine(wndPtr, el));
 	}
-	if (!wParam)
-		EDIT_ScrollIntoView(wndPtr);
 	if (EDIT_GetRedraw(wndPtr)) {
-		ORDER_UINT(s, e);
-		ORDER_UINT(s, ns);
-		ORDER_UINT(s, ne);
-		ORDER_UINT(e, ns);
-		ORDER_UINT(e, ne);
-		ORDER_UINT(ns, ne);
+		ORDER_INT32(s, e);
+		ORDER_INT32(s, ns);
+		ORDER_INT32(s, ne);
+		ORDER_INT32(e, ns);
+		ORDER_INT32(e, ne);
+		ORDER_INT32(ns, ne);
 		if (e != ns) {
 			EDIT_InvalidateText(wndPtr, s, e);
 			EDIT_InvalidateText(wndPtr, ns, ne);
 		} else
 			EDIT_InvalidateText(wndPtr, s, ne);
 	}
-	return -1L;
+	return -1;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_SETSEL16
+ *
+ */
+static LRESULT EDIT_EM_SetSel16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	INT32 ns = (INT32)LOWORD(lParam);
+	INT32 ne = (INT32)HIWORD(lParam);
+
+	if ((INT16)LOWORD(lParam) == -1)
+		ns = -1;
+	if ((INT16)HIWORD(lParam) == -1)
+		ne = -1;
+	EDIT_EM_SetSel(wndPtr, ns, ne);
+	if (!wParam)
+		EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+	return -1;
 }
 
 
@@ -2075,20 +2722,46 @@
 static LRESULT EDIT_EM_SetTabStops(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+	INT32 i;
 
 	if (!IsMultiLine(wndPtr))
-		return 0L;
+		return FALSE;
 	if (es->TabStops)
 		free(es->TabStops);
-	es->NumTabStops = (UINT)wParam;
+	es->NumTabStops = (INT32)wParam;
+	if (!wParam)
+		es->TabStops = NULL;
+	else {
+		es->TabStops = (LPINT16)xmalloc(wParam * sizeof(INT16));
+		for ( i = 0 ; i < (INT32)wParam ; i++ )
+			es->TabStops[i] = (INT16)((LPINT32)lParam)[i];
+	}
+	return TRUE;
+}
+
+
+/*********************************************************************
+ *
+ *	EM_SETTABSTOPS16
+ *
+ */
+static LRESULT EDIT_EM_SetTabStops16(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	if (!IsMultiLine(wndPtr))
+		return FALSE;
+	if (es->TabStops)
+		free(es->TabStops);
+	es->NumTabStops = (INT32)wParam;
 	if (!wParam)
 		es->TabStops = NULL;
 	else {
 		es->TabStops = (LPINT16)xmalloc(wParam * sizeof(INT16));
 		memcpy(es->TabStops, (LPINT16)PTR_SEG_TO_LIN(lParam),
-				(UINT)wParam * sizeof(INT16));
+				(INT32)wParam * sizeof(INT16));
 	}
-	return 1L;
+	return TRUE;
 }
 
 
@@ -2099,10 +2772,12 @@
  */
 static LRESULT EDIT_EM_SetWordBreakProc(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
+/*
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
 	es->WordBreakProc = (EDITWORDBREAKPROC)lParam;
-	return 0L;
+*/
+	return 0;
 }
 
 
@@ -2113,7 +2788,11 @@
  */
 static LRESULT EDIT_EM_Undo(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	return 0L;
+	fprintf(stdnimp,"edit: EM_UNDO: message not implemented\n");
+	if (IsMultiLine(wndPtr))
+		return FALSE;
+	else
+		return TRUE;
 }
 
 
@@ -2135,22 +2814,22 @@
 				EDIT_MoveHome(wndPtr, FALSE);
 				EDIT_MoveDownward(wndPtr, FALSE);
 			} else
-				EDIT_ReplaceSel(wndPtr, 0, (LPARAM)"\r\n");
+				EDIT_EM_ReplaceSel(wndPtr, 0, (LPARAM)"\r\n");
 		}
 		break;
 	case '\t':
 		if (IsMultiLine(wndPtr) && !IsReadOnly(wndPtr))
-			EDIT_ReplaceSel(wndPtr, 0, (LPARAM)"\t");
+			EDIT_EM_ReplaceSel(wndPtr, 0, (LPARAM)"\t");
 		break;
 	default:
 		if (!IsReadOnly(wndPtr) && (c >= ' ') && (c != 127)) {
  			str[0] = c;
  			str[1] = '\0';
- 			EDIT_ReplaceSel(wndPtr, 0, (LPARAM)str);
+ 			EDIT_EM_ReplaceSel(wndPtr, 0, (LPARAM)str);
  		}
 		break;
 	}
-	return 0L;
+	return 0;
 }
 
 
@@ -2161,28 +2840,32 @@
  */
 static LRESULT EDIT_WM_Clear(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	char *text;
-	BOOL redraw;
-	
+	INT32 s;
+	INT32 e;
+	LPSTR text;
+	BOOL32 redraw;
+
+	EDIT_GetSel(wndPtr, &s, &e);
 	if (s != e) {
 		redraw = EDIT_GetRedraw(wndPtr);
-		EDIT_WM_SetRedraw(wndPtr, FALSE, 0L);
-		ORDER_UINT(s, e);
+		EDIT_WM_SetRedraw(wndPtr, FALSE, 0);
+		ORDER_INT32(s, e);
 		text = EDIT_GetPointer(wndPtr);
-		strcpy(text + s, text + e);
+		lstrcpy32A(text + s, text + e);
 		EDIT_BuildLineDefs(wndPtr);
-		EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, s));
-		EDIT_EM_SetModify(wndPtr, TRUE, 0L);
+		EDIT_EM_SetSel(wndPtr, s, s);
+		EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+		EDIT_EM_SetModify(wndPtr, TRUE, 0);
+		dprintf_edit(stddeb, "edit: notification EN_UPDATE sent\n");
 		EDIT_NOTIFY_PARENT(wndPtr, EN_UPDATE);
-		EDIT_WM_SetRedraw(wndPtr, redraw, 0L);
+		EDIT_WM_SetRedraw(wndPtr, redraw, 0);
 		if (redraw) {
 			InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
+			dprintf_edit(stddeb, "edit: notification EN_CHANGE sent\n");
 			EDIT_NOTIFY_PARENT(wndPtr, EN_CHANGE);
 		}
 	}
-	return -1L;
+	return -1;
 }
 
 
@@ -2193,17 +2876,18 @@
  */
 static LRESULT EDIT_WM_Copy(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
+	INT32 s;
+	INT32 e;
 	HGLOBAL16 hdst;
-	char *text;
-	char *dst;
-	char *src;
-	int i;
+	LPSTR text;
+	LPSTR dst;
+	LPSTR src;
+	INT32 i;
 
+	EDIT_GetSel(wndPtr, &s, &e);
 	if (e == s)
-		return -1L;
-	ORDER_UINT(s, e);
+		return -1;
+	ORDER_INT32(s, e);
 	hdst = GlobalAlloc16(GMEM_MOVEABLE, (DWORD)(e - s + 1));
 	dst = GlobalLock16(hdst);
 	text = EDIT_GetPointer(wndPtr);
@@ -2216,7 +2900,7 @@
 	EmptyClipboard();
 	SetClipboardData(CF_TEXT, hdst);
 	CloseClipboard();
-	return -1L;
+	return -1;
 }
 
 
@@ -2227,9 +2911,9 @@
  */
 static LRESULT EDIT_WM_Create(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam);
+	CREATESTRUCT32A *cs = (CREATESTRUCT32A *)lParam;
 	EDITSTATE *es;
-	char *text;
+	LPSTR text;
 
 	es = xmalloc(sizeof(EDITSTATE));
 	memset(es, 0, sizeof(EDITSTATE));
@@ -2254,27 +2938,19 @@
 		es->BufLimit = BUFLIMIT_SINGLE;
 		es->PasswordChar = (cs->style & ES_PASSWORD) ? '*' : '\0';
 	}
-	if (!LOCAL_HeapSize(wndPtr->hInstance)) {
-		if (!LocalInit(wndPtr->hInstance, 0,
-                               GlobalSize16(wndPtr->hInstance))) {
-			fprintf(stderr, "edit: WM_CREATE: could not initialize local heap\n");
-			return -1L;
-		}
-		dprintf_edit(stddeb, "edit: WM_CREATE: local heap initialized\n");
-	}
-	if (!(es->hBuf = LOCAL_Alloc(wndPtr->hInstance, LMEM_MOVEABLE, es->BufSize + 1))) {
+	if (!(es->hBuf32 = LocalAlloc32(LMEM_MOVEABLE, es->BufSize + 1))) {
 		fprintf(stderr, "edit: WM_CREATE: unable to allocate buffer\n");
-		return -1L;
+		return -1;
 	}
-	es->BufSize = LOCAL_Size(wndPtr->hInstance, es->hBuf) - 1;
+	es->BufSize = LocalSize32(es->hBuf32) - 1;
 	text = EDIT_GetPointer(wndPtr);
 	*text = '\0';
 	EDIT_BuildLineDefs(wndPtr);
-	EDIT_WM_SetFont(wndPtr, 0, 0L);
-	if (cs->lpszName && *(char *)PTR_SEG_TO_LIN(cs->lpszName) != '\0')
+	EDIT_WM_SetFont(wndPtr, 0, 0);
+	if (cs->lpszName && *(cs->lpszName) != '\0')
 		EDIT_EM_ReplaceSel(wndPtr, FALSE, (LPARAM)cs->lpszName);
-	EDIT_WM_SetRedraw(wndPtr, TRUE, 0L);
-	return 0L;
+	EDIT_WM_SetRedraw(wndPtr, TRUE, 0);
+	return 0;
 }
 
 
@@ -2285,9 +2961,9 @@
  */
 static LRESULT EDIT_WM_Cut(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	EDIT_WM_Copy(wndPtr, 0, 0L);
-	EDIT_WM_Clear(wndPtr, 0, 0L);
-	return -1L;
+	EDIT_WM_Copy(wndPtr, 0, 0);
+	EDIT_WM_Clear(wndPtr, 0, 0);
+	return -1;
 }
 
 
@@ -2304,10 +2980,13 @@
 	if (es->TabStops)
 		free(es->TabStops);
 	EDIT_ReleasePointer(wndPtr);
-	LOCAL_Free(wndPtr->hInstance, es->hBuf);
+	if (es->hBuf32)
+		LocalFree32(es->hBuf32);
+	else
+		LOCAL_Free(wndPtr->hInstance, es->hBuf16);
 	free(es);
 	*(EDITSTATE **)&wndPtr->wExtra = NULL;
-	return 0L;
+	return 0;
 }
 
 
@@ -2319,7 +2998,7 @@
 static LRESULT EDIT_WM_Enable(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	EDIT_InvalidateText(wndPtr, 0, -1);
-	return 0L;
+	return 0;
 }
 
 
@@ -2331,23 +3010,23 @@
 static LRESULT EDIT_WM_EraseBkGnd(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	HBRUSH32 hBrush;
-	RECT16 rc;
+	RECT32 rc;
 
-	hBrush = (HBRUSH16)EDIT_SEND_CTLCOLOR(wndPtr, wParam);
+	hBrush = (HBRUSH32)EDIT_SEND_CTLCOLOR(wndPtr, wParam);
 	if (!hBrush) hBrush = (HBRUSH32)GetStockObject32(WHITE_BRUSH);
 
-	GetClientRect16(wndPtr->hwndSelf, &rc);
-	IntersectClipRect16( (HDC16)wParam, rc.left, rc.top,
-                             rc.right, rc.bottom);
-	GetClipBox16((HDC16)wParam, &rc);
+	GetClientRect32(wndPtr->hwndSelf, &rc);
+	IntersectClipRect32((HDC32)wParam, rc.left, rc.top,
+			     rc.right, rc.bottom);
+	GetClipBox32((HDC32)wParam, &rc);
 	/*
 	 *	FIXME:	specs say that we should UnrealizeObject() the brush,
 	 *		but the specs of UnrealizeObject() say that we shouldn't
 	 *		unrealize a stock object.  The default brush that
 	 *		DefWndProc() returns is ... a stock object.
 	 */
-	FillRect16((HDC16)wParam, &rc, hBrush);
-	return -1L;
+	FillRect32((HDC32)wParam, &rc, hBrush);
+	return -1;
 }
 
 
@@ -2382,14 +3061,14 @@
  */
 static LRESULT EDIT_WM_GetText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	char *text = EDIT_GetPointer(wndPtr);
-	int len;
-	LRESULT lResult = 0L;
+	LPSTR text = EDIT_GetPointer(wndPtr);
+	INT32 len;
+	LRESULT lResult = 0;
 
-	len = strlen(text);
-	if ((UINT)wParam > len) {
-		strcpy((char *)PTR_SEG_TO_LIN(lParam), text);
-		lResult = (LRESULT)len ;
+	len = lstrlen32A(text);
+	if ((INT32)wParam > len) {
+		lstrcpy32A((LPSTR)lParam, text);
+		lResult = (LRESULT)len + 1;
 	}
 	return lResult;
 }
@@ -2402,11 +3081,11 @@
  */
 static LRESULT EDIT_WM_GetTextLength(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	char *text = EDIT_GetPointer(wndPtr);
+	LPSTR text = EDIT_GetPointer(wndPtr);
 
-	return (LRESULT)strlen(text);
+	return (LRESULT)lstrlen32A(text);
 }
- 
+
 
 /*********************************************************************
  *
@@ -2417,13 +3096,13 @@
  */
 static LRESULT EDIT_WM_HScroll(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT ww = EDIT_GetWndWidth(wndPtr);
-	UINT tw = EDIT_GetTextWidth(wndPtr);
-	UINT cw = EDIT_GetAveCharWidth(wndPtr);
-	UINT xoff = EDIT_GetXOffset(wndPtr);
-	INT dx = 0;
-	BOOL not = TRUE;
-	LRESULT ret = 0L;
+	INT32 ww = EDIT_GetWndWidth(wndPtr);
+	INT32 tw = EDIT_GetTextWidth(wndPtr);
+	INT32 cw = EDIT_GetAveCharWidth(wndPtr);
+	INT32 xoff = EDIT_GetXOffset(wndPtr);
+	INT32 dx = 0;
+	BOOL32 not = TRUE;
+	LRESULT ret = 0;
 
 	switch (wParam) {
 	case SB_LINELEFT:
@@ -2449,23 +3128,25 @@
  *		not = FALSE;
  */
 	case SB_THUMBPOSITION:
-		dx = LOWORD(lParam) * tw / 100 - xoff;
+		dx = HIWORD(wParam) * tw / 100 - xoff;
 		break;
 	/* The next two are undocumented ! */
-	case EM_GETTHUMB:
-		ret = tw ? MAKELONG(xoff * 100 / tw, 0) : 0;
+	case EM_GETTHUMB16:
+		ret = tw ? xoff * 100 / tw : 0;
 		break;
-	case EM_LINESCROLL:
-		dx = LOWORD(lParam);
+	case EM_LINESCROLL16:
+		dx = (INT16)HIWORD(wParam);
 		break;
 	case SB_ENDSCROLL:
 	default:
 		break;
 	}
 	if (dx) {
-		EDIT_EM_LineScroll(wndPtr, 0, MAKELPARAM(0, dx));
-		if (not)
+		EDIT_EM_LineScroll(wndPtr, dx, 0);
+		if (not) {
+			dprintf_edit(stddeb, "edit: notification EN_HSCROLL sent\n");
 			EDIT_NOTIFY_PARENT(wndPtr, EN_HSCROLL);
+		}
 	}
 	return ret;
 }
@@ -2481,17 +3162,18 @@
  */
 static LRESULT EDIT_WM_KeyDown(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	BOOL shift;
-	BOOL control;
+	INT32 s;
+	INT32 e;
+	BOOL32 shift;
+	BOOL32 control;
 
 	if (GetKeyState(VK_MENU) & 0x8000)
-		return 0L;
+		return 0;
 
 	shift = GetKeyState(VK_SHIFT) & 0x8000;
 	control = GetKeyState(VK_CONTROL) & 0x8000;
 
+	EDIT_GetSel(wndPtr, &s, &e);
 	switch (wParam) {
 	case VK_LEFT:
 	case VK_UP:
@@ -2529,7 +3211,7 @@
 	case VK_BACK:
 		if (!IsReadOnly(wndPtr) && !control)
 			if (e != s)
-				EDIT_WM_Clear(wndPtr, 0, 0L);
+				EDIT_WM_Clear(wndPtr, 0, 0);
 			else
 				EDIT_DelLeft(wndPtr);
 		break;
@@ -2537,9 +3219,9 @@
 		if (!IsReadOnly(wndPtr) && !(shift && control))
 			if (e != s) {
 				if (shift)
-					EDIT_WM_Cut(wndPtr, 0, 0L);
+					EDIT_WM_Cut(wndPtr, 0, 0);
 				else
-					EDIT_WM_Clear(wndPtr, 0, 0L);
+					EDIT_WM_Clear(wndPtr, 0, 0);
 			} else {
 				if (shift)
 					EDIT_DelLeft(wndPtr);
@@ -2552,12 +3234,12 @@
 	case VK_INSERT:
 		if (shift) {
 			if (!IsReadOnly(wndPtr))
-				EDIT_WM_Paste(wndPtr, 0, 0L);
+				EDIT_WM_Paste(wndPtr, 0, 0);
 		} else if (control)
-			EDIT_WM_Copy(wndPtr, 0, 0L);
+			EDIT_WM_Copy(wndPtr, 0, 0);
 		break;
 	}
-	return 0L;
+	return 0;
 }
 
 
@@ -2568,17 +3250,17 @@
  */
 static LRESULT EDIT_WM_KillFocus(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s;
-	UINT e;
+	INT32 s;
+	INT32 e;
 
 	DestroyCaret();
 	if(!(wndPtr->dwStyle & ES_NOHIDESEL)) {
-		s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-		e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
+		EDIT_GetSel(wndPtr, &s, &e);
 		EDIT_InvalidateText(wndPtr, s, e);
 	}
+	dprintf_edit(stddeb, "edit: notification EN_KILLFOCUS sent\n");
 	EDIT_NOTIFY_PARENT(wndPtr, EN_KILLFOCUS);
-	return 0L;
+	return 0;
 }
 
 
@@ -2591,17 +3273,22 @@
  */
 static LRESULT EDIT_WM_LButtonDblClk(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s;
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT l = (UINT)EDIT_EM_LineFromChar(wndPtr, e, 0L);
-	UINT li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-	UINT ll = (UINT)EDIT_EM_LineLength(wndPtr, e, 0L);
-	char *text = EDIT_GetPointer(wndPtr);
+	INT32 s;
+	INT32 e;
+	INT32 l;
+	INT32 li;
+	INT32 ll;
+	LPSTR text = EDIT_GetPointer(wndPtr);
 
+	EDIT_GetSel(wndPtr, NULL, &e);
+	l = (INT32)EDIT_EM_LineFromChar(wndPtr, e, 0);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
+	ll = (INT32)EDIT_EM_LineLength(wndPtr, e, 0);
 	s = li + EDIT_CallWordBreakProc (wndPtr, text + li, e - li, ll, WB_LEFT);
 	e = li + EDIT_CallWordBreakProc(wndPtr, text + li, e - li, ll, WB_RIGHT);
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
-	return 0L;
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+	return 0;
 }
 
 
@@ -2612,29 +3299,30 @@
  */
 static LRESULT EDIT_WM_LButtonDown(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	INT x = (INT)LOWORD(lParam);
-	INT y = (INT)HIWORD(lParam);
-	UINT l = EDIT_LineFromWndY(wndPtr, y);
-	UINT c;
-	UINT s;
-	UINT e;
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
-	UINT li;
+	INT32 x = (INT32)(INT16)LOWORD(lParam);
+	INT32 y = (INT32)(INT16)HIWORD(lParam);
+	INT32 l = EDIT_LineFromWndY(wndPtr, y);
+	INT32 c;
+	INT32 s;
+	INT32 e;
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT32 li;
 
 	SetFocus32(wndPtr->hwndSelf);
 	SetCapture32(wndPtr->hwndSelf);
 	l = MIN(fv + vlc - 1, MAX(fv, l));
 	x = MIN(EDIT_GetWndWidth(wndPtr), MAX(0, x));
 	c = EDIT_ColFromWndX(wndPtr, l, x);
-	li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
+	li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
 	e = li + c;
 	if (GetKeyState(VK_SHIFT) & 0x8000)
-		s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	else 
+		EDIT_GetSel(wndPtr, &s, NULL);
+	else
 		s = e;
-	EDIT_EM_SetSel(wndPtr, 0, MAKELPARAM(s, e));
-	return 0L;
+	EDIT_EM_SetSel(wndPtr, s, e);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+	return 0;
 }
 
 
@@ -2647,7 +3335,7 @@
 {
 	if (GetCapture32() == wndPtr->hwndSelf)
 		ReleaseCapture();
-	return 0L;
+	return 0;
 }
 
 
@@ -2658,29 +3346,29 @@
  */
 static LRESULT EDIT_WM_MouseMove(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	INT x;
-	INT y;
-	UINT l;
-	UINT c;
-	UINT s;
-	UINT fv;
-	UINT vlc;
-	UINT li;
+	INT32 x;
+	INT32 y;
+	INT32 l;
+	INT32 c;
+	INT32 s;
+	INT32 fv;
+	INT32 vlc;
+	INT32 li;
 
 	if (GetCapture32() == wndPtr->hwndSelf) {
-		x = (INT)LOWORD(lParam);
-		y = (INT)HIWORD(lParam);
-		fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
+		x = (INT32)(INT16)LOWORD(lParam);
+		y = (INT32)(INT16)HIWORD(lParam);
+		fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
 		vlc = EDIT_GetVisibleLineCount(wndPtr);
 		l = EDIT_LineFromWndY(wndPtr, y);
 		l = MIN(fv + vlc - 1, MAX(fv, l));
 		x = MIN(EDIT_GetWndWidth(wndPtr), MAX(0, x));
 		c = EDIT_ColFromWndX(wndPtr, l, x);
-		s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-		li = (UINT)EDIT_EM_LineIndex(wndPtr, l, 0L);
-		EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(s, li + c));
+		EDIT_GetSel(wndPtr, &s, NULL);
+		li = (INT32)EDIT_EM_LineIndex(wndPtr, l, 0);
+		EDIT_EM_SetSel(wndPtr, s, li + c);
 	}
-	return 0L;
+	return 0;
 }
 
 
@@ -2691,38 +3379,39 @@
  */
 static LRESULT EDIT_WM_Paint(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	PAINTSTRUCT16 ps;
-	UINT i;
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	HDC16 hdc;
-	HFONT16 hFont;
+	PAINTSTRUCT32 ps;
+	INT32 i;
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
+	HDC32 hdc;
+	HFONT32 hFont;
 	HFONT32 oldFont = 0;
-	RECT16 rc;
-	RECT16 rcLine;
-	RECT16 rcRgn;
-	BOOL rev = IsWindowEnabled(wndPtr->hwndSelf) &&
+	RECT32 rc;
+	RECT32 rcLine;
+	RECT32 rcRgn;
+	BOOL32 rev = IsWindowEnabled(wndPtr->hwndSelf) &&
 				((GetFocus32() == wndPtr->hwndSelf) ||
 					(wndPtr->dwStyle & ES_NOHIDESEL));
 
-	hdc = BeginPaint16(wndPtr->hwndSelf, &ps);
-	GetClientRect16(wndPtr->hwndSelf, &rc);
-	IntersectClipRect16( hdc, rc.left, rc.top, rc.right, rc.bottom );
-	hFont = EDIT_WM_GetFont(wndPtr, 0, 0L);
-	if (hFont) oldFont = SelectObject32(hdc, hFont);
+	hdc = BeginPaint32(wndPtr->hwndSelf, &ps);
+	GetClientRect32(wndPtr->hwndSelf, &rc);
+	IntersectClipRect32( hdc, rc.left, rc.top, rc.right, rc.bottom );
+	hFont = (HFONT32)EDIT_WM_GetFont(wndPtr, 0, 0);
+	if (hFont)
+		oldFont = (HFONT32)SelectObject32(hdc, hFont);
 	EDIT_SEND_CTLCOLOR(wndPtr, hdc);
 	if (!IsWindowEnabled(wndPtr->hwndSelf))
 		SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT));
-	GetClipBox16(hdc, &rcRgn);
+	GetClipBox32(hdc, &rcRgn);
 	for (i = fv ; i <= MIN(fv + vlc, fv + lc - 1) ; i++ ) {
 		EDIT_GetLineRect(wndPtr, i, 0, -1, &rcLine);
-		if (IntersectRect16(&rc, &rcRgn, &rcLine))
+		if (IntersectRect32(&rc, &rcRgn, &rcLine))
 			EDIT_PaintLine(wndPtr, hdc, i, rev);
 	}
 	if (hFont) SelectObject32(hdc, oldFont);
-	EndPaint16(wndPtr->hwndSelf, &ps);
-	return 0L;
+	EndPaint32(wndPtr->hwndSelf, &ps);
+	return 0;
 }
 
 
@@ -2734,16 +3423,16 @@
 static LRESULT EDIT_WM_Paste(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
 	HGLOBAL16 hsrc;
-	char *src;
+	LPSTR src;
 
 	OpenClipboard(wndPtr->hwndSelf);
 	if ((hsrc = GetClipboardData(CF_TEXT))) {
-		src = (char *)GlobalLock16(hsrc);
-		EDIT_ReplaceSel(wndPtr, 0, (LPARAM)src);
+		src = (LPSTR)GlobalLock16(hsrc);
+		EDIT_EM_ReplaceSel(wndPtr, 0, (LPARAM)src);
 		GlobalUnlock16(hsrc);
 	}
 	CloseClipboard();
-	return -1L;
+	return -1;
 }
 
 
@@ -2756,9 +3445,9 @@
 {
 	if (LOWORD(lParam) == HTCLIENT) {
 		SetCursor(LoadCursor16(0, IDC_IBEAM));
-		return -1L;
+		return -1;
 	} else
-		return 0L;
+		return 0;
 }
 
 
@@ -2769,16 +3458,18 @@
  */
 static LRESULT EDIT_WM_SetFocus(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT s = LOWORD(EDIT_GetSel(wndPtr, 0, 0L));
-	UINT e = HIWORD(EDIT_GetSel(wndPtr, 0, 0L));
+	INT32 s;
+	INT32 e;
 
+	EDIT_GetSel(wndPtr, &s, &e);
 	CreateCaret(wndPtr->hwndSelf, 0, 2, EDIT_GetLineHeight(wndPtr));
-	EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(s, e));
+	EDIT_EM_SetSel(wndPtr, s, e);
 	if(!(wndPtr->dwStyle & ES_NOHIDESEL))
 		EDIT_InvalidateText(wndPtr, s, e);
 	ShowCaret(wndPtr->hwndSelf);
+	dprintf_edit(stddeb, "edit: notification EN_SETFOCUS sent\n");
 	EDIT_NOTIFY_PARENT(wndPtr, EN_SETFOCUS);
-	return 0L;
+	return 0;
 }
 
 
@@ -2789,30 +3480,32 @@
  */
 static LRESULT EDIT_WM_SetFont(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	TEXTMETRIC16 tm;
+	TEXTMETRIC32A tm;
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
-	LPARAM sel = EDIT_GetSel(wndPtr, 0, 0L);
+	INT32 s;
+	INT32 e;
 	HDC32 hdc;
 	HFONT32 oldFont = 0;
 
-	es->hFont = (HFONT16)wParam;
+	EDIT_GetSel(wndPtr, &s, &e);
+	es->hFont = (HFONT32)wParam;
 	hdc = GetDC32(wndPtr->hwndSelf);
 	if (es->hFont) oldFont = SelectObject32(hdc, es->hFont);
-	GetTextMetrics16(hdc, &tm);
-	es->LineHeight = HIWORD(GetTextExtent(hdc, "X", 1));
+	GetTextMetrics32A(hdc, &tm);
+	es->LineHeight = tm.tmHeight;
 	es->AveCharWidth = tm.tmAveCharWidth;
 	if (es->hFont) SelectObject32(hdc, oldFont);
 	ReleaseDC32(wndPtr->hwndSelf, hdc);
 	EDIT_BuildLineDefs(wndPtr);
-	if ((BOOL)lParam && EDIT_GetRedraw(wndPtr))
+	if ((BOOL32)lParam && EDIT_GetRedraw(wndPtr))
 		InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
 	if (wndPtr->hwndSelf == GetFocus32()) {
 		DestroyCaret();
 		CreateCaret(wndPtr->hwndSelf, 0, 2, EDIT_GetLineHeight(wndPtr));
-		EDIT_EM_SetSel(wndPtr, 1, sel);
+		EDIT_EM_SetSel16(wndPtr, s, e);
 		ShowCaret(wndPtr->hwndSelf);
 	}
-	return 0L;
+	return 0;
 }
 
 
@@ -2825,8 +3518,8 @@
 {
 	EDITSTATE *es = EDITSTATEPTR(wndPtr);
 
-	es->Redraw = (BOOL)wParam;
-	return 0L;
+	es->Redraw = (BOOL32)wParam;
+	return 0;
 }
 
 
@@ -2837,14 +3530,15 @@
  */
 static LRESULT EDIT_WM_SetText(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	EDIT_EM_SetSel(wndPtr, 1, MAKELPARAM(0, -1));
-	EDIT_WM_Clear(wndPtr, 0, 0L);
+	EDIT_EM_SetSel(wndPtr, 0, -1);
 	if (lParam)
 		EDIT_EM_ReplaceSel(wndPtr, 0, lParam);
-	EDIT_EM_EmptyUndoBuffer(wndPtr, 0, 0L);
-	EDIT_EM_SetModify(wndPtr, TRUE, 0L);
-	EDIT_ScrollIntoView(wndPtr);
-	return 0L;
+	else
+            EDIT_WM_Clear(wndPtr, 0, 0);
+	EDIT_EM_EmptyUndoBuffer(wndPtr, 0, 0);
+	EDIT_EM_SetModify(wndPtr, TRUE, 0);
+	EDIT_EM_ScrollCaret(wndPtr, 0, 0);
+	return 1;
 }
 
 
@@ -2852,9 +3546,14 @@
  *
  *	WM_SIZE
  *
+ *	FIXME: What about that FormatRect ???
+ *
  */
 static LRESULT EDIT_WM_Size(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
+	EDITSTATE *es = EDITSTATEPTR(wndPtr);
+
+	GetClientRect32(wndPtr->hwndSelf, &es->FormatRect);
 	if (EDIT_GetRedraw(wndPtr) &&
 			((wParam == SIZE_MAXIMIZED) ||
 				(wParam == SIZE_RESTORED))) {
@@ -2862,7 +3561,7 @@
 			EDIT_BuildLineDefs(wndPtr);
 		InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
 	}
-	return 0L;
+	return 0;
 }
 
 
@@ -2875,12 +3574,12 @@
  */
 static LRESULT EDIT_WM_VScroll(WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-	UINT lc = (UINT)EDIT_EM_GetLineCount(wndPtr, 0, 0L);
-	UINT fv = (UINT)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0L);
-	UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
-	INT dy = 0;
-	BOOL not = TRUE;
-	LRESULT ret = 0L;
+	INT32 lc = (INT32)EDIT_EM_GetLineCount(wndPtr, 0, 0);
+	INT32 fv = (INT32)EDIT_EM_GetFirstVisibleLine(wndPtr, 0, 0);
+	INT32 vlc = EDIT_GetVisibleLineCount(wndPtr);
+	INT32 dy = 0;
+	BOOL32 not = TRUE;
+	LRESULT ret = 0;
 
 	switch (wParam) {
 	case SB_LINEUP:
@@ -2902,27 +3601,28 @@
 		dy = lc - 1 - fv;
 		break;
 	case SB_THUMBTRACK:
-/*
- *		not = FALSE;
- */
+		not = FALSE;
+		/* fall through */
 	case SB_THUMBPOSITION:
-		dy = LOWORD(lParam) * (lc - 1) / 100 - fv;
+		dy = HIWORD(wParam) * (lc - 1) / 100 - fv;
 		break;
 	/* The next two are undocumented ! */
-	case EM_GETTHUMB:
-		ret = (lc > 1) ? MAKELONG(fv * 100 / (lc - 1), 0) : 0L;
+	case EM_GETTHUMB16:
+		ret = (lc > 1) ? MAKELONG(fv * 100 / (lc - 1), 0) : 0;
 		break;
-	case EM_LINESCROLL:
-		dy = LOWORD(lParam);
+	case EM_LINESCROLL16:
+		dy = (INT16)LOWORD(lParam);
 		break;
 	case SB_ENDSCROLL:
 	default:
 		break;
 	}
 	if (dy) {
-		EDIT_EM_LineScroll(wndPtr, 0, MAKELPARAM(dy, 0));
-		if (not)
+		EDIT_EM_LineScroll(wndPtr, 0, dy);
+		if (not) {
+			dprintf_edit(stddeb, "edit: notification EN_VSCROLL sent\n");
 			EDIT_NOTIFY_PARENT(wndPtr, EN_VSCROLL);
+		}
 	}
 	return ret;
 }