diff --git a/if1632/relay.c b/if1632/relay.c
index a47d2e9b6487356d4e3c6c9a9b3dc98c80978406..b82868b3b9e9b35fc3178442c485bad3ecf62a0f 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -224,7 +224,7 @@ void RELAY_DebugCallFrom16Ret( CONTEXT86 *context, int ret_val )
               || memcmp( args+2, "intr_", 5 ) == 0 )
     {
         DPRINTF("retval=none ret=%04x:%04x ds=%04x\n",
-                (WORD)CS_reg(context), IP_reg(context), (WORD)DS_reg(context));
+                (WORD)CS_reg(context), LOWORD(EIP_reg(context)), (WORD)DS_reg(context));
         DPRINTF("     AX=%04x BX=%04x CX=%04x DX=%04x SI=%04x DI=%04x ES=%04x EFL=%08lx\n",
                 AX_reg(context), BX_reg(context), CX_reg(context),
                 DX_reg(context), SI_reg(context), DI_reg(context),
@@ -275,7 +275,7 @@ void RELAY_DebugCallTo16( int* stack, int nb_args )
         CONTEXT86 *context = (CONTEXT86 *)stack[0];
         WORD *stack16 = (WORD *)THREAD_STACK16(teb);
         DPRINTF("CallTo16(func=%04lx:%04x,ds=%04lx",
-                CS_reg(context), IP_reg(context), DS_reg(context) );
+                CS_reg(context), LOWORD(EIP_reg(context)), DS_reg(context) );
         nb_args = stack[1] / sizeof(WORD);
         while (nb_args--) {
 	    --stack16;
@@ -344,13 +344,13 @@ void WINAPI Catch16( LPCATCHBUF lpbuf, CONTEXT86 *context )
      * lpbuf[8] = ss
      */
 
-    lpbuf[0] = IP_reg(context);
+    lpbuf[0] = LOWORD(EIP_reg(context));
     lpbuf[1] = CS_reg(context);
     /* Windows pushes 4 more words before saving sp */
-    lpbuf[2] = SP_reg(context) - 4 * sizeof(WORD);
-    lpbuf[3] = BP_reg(context);
-    lpbuf[4] = SI_reg(context);
-    lpbuf[5] = DI_reg(context);
+    lpbuf[2] = LOWORD(ESP_reg(context)) - 4 * sizeof(WORD);
+    lpbuf[3] = LOWORD(EBP_reg(context));
+    lpbuf[4] = LOWORD(ESI_reg(context));
+    lpbuf[5] = LOWORD(EDI_reg(context));
     lpbuf[6] = DS_reg(context);
     lpbuf[7] = 0;
     lpbuf[8] = SS_reg(context);
@@ -388,13 +388,13 @@ void WINAPI Throw16( LPCATCHBUF lpbuf, INT16 retval, CONTEXT86 *context )
         frame32 = ((STACK16FRAME *)PTR_SEG_TO_LIN(frame32->frame16))->frame32;
     }
 
-    IP_reg(context) = lpbuf[0];
-    CS_reg(context) = lpbuf[1];
-    SP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) - sizeof(WORD) /*extra arg*/;
-    BP_reg(context) = lpbuf[3];
-    SI_reg(context) = lpbuf[4];
-    DI_reg(context) = lpbuf[5];
-    DS_reg(context) = lpbuf[6];
+    EIP_reg(context) = lpbuf[0];
+    CS_reg(context)  = lpbuf[1];
+    ESP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) - sizeof(WORD) /*extra arg*/;
+    EBP_reg(context) = lpbuf[3];
+    ESI_reg(context) = lpbuf[4];
+    EDI_reg(context) = lpbuf[5];
+    DS_reg(context)  = lpbuf[6];
 
     if (lpbuf[8] != SS_reg(context))
         ERR("Switching stack segment with Throw() not supported; expect crash now\n" );
@@ -491,7 +491,7 @@ static DWORD RELAY_CallProc32W(int Ex)
 		break;
 	}
 	/* POP nrofargs DWORD arguments and 3 DWORD parameters */
-        if (!Ex) STACK16_POP( NtCurrentTeb(), (3 + nrofargs) * sizeof(DWORD) );
+        if (!Ex) stack16_pop( (3 + nrofargs) * sizeof(DWORD) );
 
 	TRACE("%s - returns %08lx\n",dbg_str(relay),ret);
 	HeapFree( GetProcessHeap(), 0, args );
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 6284b333f4ba520b4de56ea24f330dd002d4aa99..76a61e653b663f6c234615d568f0918983c7255b 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -293,7 +293,7 @@ static LRESULT WINAPI THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd,
 	if (offset)
 	{
 	    void *s = PTR_SEG_TO_LIN(lParam);
-	    lParam = STACK16_PUSH( teb, offset );
+	    lParam = stack16_push( offset );
 	    memcpy( PTR_SEG_TO_LIN(lParam), s, offset );
 	}
     }
@@ -308,7 +308,7 @@ static LRESULT WINAPI THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd,
     args[4] = hwnd;
 
     ret = CallTo16RegisterShort( &context, 5 * sizeof(WORD) );
-    if (offset) STACK16_POP( teb, offset );
+    if (offset) stack16_pop( offset );
 
     WIN_RestoreWndsLock(iWndsLocks);
 
@@ -820,10 +820,10 @@ static void THUNK_CallSystemTimerProc( FARPROC16 proc, WORD timer )
     CONTEXT86 context;
     memset( &context, '\0', sizeof(context) );
 
-    CS_reg( &context ) = SELECTOROF( proc );
-    IP_reg( &context ) = OFFSETOF( proc );
-    BP_reg( &context ) = OFFSETOF( NtCurrentTeb()->cur_stack )
-                         + (WORD)&((STACK16FRAME*)0)->bp;
+    CS_reg( &context )  = SELECTOROF( proc );
+    EIP_reg( &context ) = OFFSETOF( proc );
+    EBP_reg( &context ) = OFFSETOF( NtCurrentTeb()->cur_stack )
+                          + (WORD)&((STACK16FRAME*)0)->bp;
 
     AX_reg( &context ) = timer;
 
@@ -1052,12 +1052,12 @@ void WINAPI C16ThkSL(CONTEXT86 *context)
                               *((WORD *)x)++ = cs;
 
     /* Jump to the stub code just created */
-    IP_reg(context) = LOWORD(EAX_reg(context));
-    CS_reg(context) = HIWORD(EAX_reg(context));
+    EIP_reg(context) = LOWORD(EAX_reg(context));
+    CS_reg(context)  = HIWORD(EAX_reg(context));
 
     /* Since C16ThkSL got called by a jmp, we need to leave the
-       orginal return address on the stack */
-    SP_reg(context) -= 4;
+       original return address on the stack */
+    ESP_reg(context) -= 4;
 }
 
 /***********************************************************************
@@ -1107,12 +1107,12 @@ void WINAPI C16ThkSL01(CONTEXT86 *context)
                                   *((WORD *)x)++ = cs;
 
         /* Jump to the stub code just created */
-        IP_reg(context) = LOWORD(EAX_reg(context));
-        CS_reg(context) = HIWORD(EAX_reg(context));
+        EIP_reg(context) = LOWORD(EAX_reg(context));
+        CS_reg(context)  = HIWORD(EAX_reg(context));
 
         /* Since C16ThkSL01 got called by a jmp, we need to leave the
            orginal return address on the stack */
-        SP_reg(context) -= 4;
+        ESP_reg(context) -= 4;
     }
     else
     {
@@ -1145,12 +1145,12 @@ void WINAPI C16ThkSL01(CONTEXT86 *context)
         }
         else
         {
-            WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context));
+            WORD *stack = PTR_SEG_OFF_TO_LIN(SS_reg(context), LOWORD(ESP_reg(context)));
             DX_reg(context) = HIWORD(td->apiDB[targetNr].errorReturnValue);
             AX_reg(context) = LOWORD(td->apiDB[targetNr].errorReturnValue);
-            IP_reg(context) = stack[2];
-            CS_reg(context) = stack[3];
-            SP_reg(context) += td->apiDB[targetNr].nrArgBytes + 4;
+            EIP_reg(context) = stack[2];
+            CS_reg(context)  = stack[3];
+            ESP_reg(context) += td->apiDB[targetNr].nrArgBytes + 4;
 
             ERR_(thunk)("Process %08lx did not ThunkConnect32 %s to %s\n",
                        (DWORD)PROCESS_Current(), td->pszDll32, td->pszDll16);
@@ -1162,13 +1162,17 @@ DWORD WINAPI
 WOW16Call(WORD x,WORD y,WORD z) {
 	int	i;
 	DWORD	calladdr;
+        VA_LIST16 args;
 	FIXME_(thunk)("(0x%04x,0x%04x,%d),calling (",x,y,z);
 
+        VA_START16(args);
 	for (i=0;i<x/2;i++) {
-		WORD	a = STACK16_POP(NtCurrentTeb(),2);
+		WORD	a = VA_ARG16(args,WORD);
 		DPRINTF("%04x ",a);
 	}
-	calladdr = STACK16_POP(NtCurrentTeb(),4);
+	calladdr = VA_ARG16(args,DWORD);
+        VA_END16(args);
+        stack16_pop( x + sizeof(DWORD) );
 	DPRINTF(") calling address was 0x%08lx\n",calladdr);
 	return 0;
 }
@@ -1536,7 +1540,7 @@ void WINAPI InitCBClient16( FARPROC glueLS )
 void WINAPI CBClientGlueSL( CONTEXT86 *context )
 {
     /* Create stack frame */
-    SEGPTR stackSeg = STACK16_PUSH( NtCurrentTeb(), 12 );
+    SEGPTR stackSeg = stack16_push( 12 );
     LPWORD stackLin = PTR_SEG_TO_LIN( stackSeg );
     SEGPTR glue;
     
@@ -1545,8 +1549,8 @@ void WINAPI CBClientGlueSL( CONTEXT86 *context )
     stackLin[1] = DI_reg( context );
     stackLin[0] = DS_reg( context );
 
-    BP_reg( context ) = OFFSETOF( stackSeg ) + 6;
-    SP_reg( context ) = OFFSETOF( stackSeg ) - 4;
+    EBP_reg( context ) = OFFSETOF( stackSeg ) + 6;
+    ESP_reg( context ) = OFFSETOF( stackSeg ) - 4;
     GS_reg( context ) = 0;
 
     /* Jump to 16-bit relay code */
@@ -1591,7 +1595,7 @@ void WINAPI CBClientThunkSLEx( CONTEXT86 *context )
     SI_reg( context ) = stackLin[2];
     DI_reg( context ) = stackLin[1];
     DS_reg( context ) = stackLin[0];
-    SP_reg( context ) += 16+nArgs;
+    ESP_reg( context ) += 16+nArgs;
 
     /* Return to caller of CBClient thunklet */
     CS_reg ( context ) = stackLin[9];
diff --git a/include/sig_context.h b/include/sig_context.h
index 933c432b1e00f5153d7eee25c39fb89332f4faa8..eda1c93299bc97adb5edbda537caab68272740cf 100644
--- a/include/sig_context.h
+++ b/include/sig_context.h
@@ -236,30 +236,6 @@ typedef struct _CONTEXT		/* Note 1 */
 
 #endif  /* __EMX__ */
 
-/* Generic definitions */
-
-#define AX_sig(context)      (*(WORD*)&EAX_sig(context))
-#define BX_sig(context)      (*(WORD*)&EBX_sig(context))
-#define CX_sig(context)      (*(WORD*)&ECX_sig(context))
-#define DX_sig(context)      (*(WORD*)&EDX_sig(context))
-#define SI_sig(context)      (*(WORD*)&ESI_sig(context))
-#define DI_sig(context)      (*(WORD*)&EDI_sig(context))
-#define BP_sig(context)      (*(WORD*)&EBP_sig(context))
-
-#define AL_sig(context)      (*(BYTE*)&EAX_sig(context))
-#define AH_sig(context)      (*((BYTE*)&EAX_sig(context)+1))
-#define BL_sig(context)      (*(BYTE*)&EBX_sig(context))
-#define BH_sig(context)      (*((BYTE*)&EBX_sig(context)+1))
-#define CL_sig(context)      (*(BYTE*)&ECX_sig(context))
-#define CH_sig(context)      (*((BYTE*)&ECX_sig(context)+1))
-#define DL_sig(context)      (*(BYTE*)&EDX_sig(context))
-#define DH_sig(context)      (*((BYTE*)&EDX_sig(context)+1))
-                            
-#define IP_sig(context)      (*(WORD*)&EIP_sig(context))
-#define SP_sig(context)      (*(WORD*)&ESP_sig(context))
-                            
-#define FL_sig(context)      (*(WORD*)&EFL_sig(context))
-
 #ifdef FS_sig
 #include "syslevel.h"
 #define HANDLER_INIT() \
diff --git a/include/stackframe.h b/include/stackframe.h
index 5e6a8211bb9f801bdc84213826daa94b4d147adb..992ea457e3b5d1ec5fda4d0aa0dd2e9af0b5ef8c 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -7,6 +7,7 @@
 #ifndef __WINE_STACKFRAME_H
 #define __WINE_STACKFRAME_H
 
+#include <string.h>
 #include "ldt.h"
 #include "thread.h"
 
@@ -67,26 +68,44 @@ typedef void *VA_LIST16;
      *((type *)(void *)((char *)(list) - __VA_ROUNDED16(type))))
 #define VA_END16(list) ((void)0)
 
+
 /* Push bytes on the 16-bit stack of a thread;
  * return a segptr to the first pushed byte
  */
-#define STACK16_PUSH(teb,size) \
- (memmove((char*)THREAD_STACK16(teb)-(size),THREAD_STACK16(teb), \
-          sizeof(STACK16FRAME)), \
-  (teb)->cur_stack -= (size), \
-  (SEGPTR)((teb)->cur_stack + sizeof(STACK16FRAME)))
+static inline SEGPTR WINE_UNUSED stack16_push( int size )
+{
+    TEB *teb = NtCurrentTeb();
+    STACK16FRAME *frame = THREAD_STACK16(teb);
+    memmove( (char*)frame - size, frame, sizeof(*frame) );
+    teb->cur_stack -= size;
+    return (SEGPTR)(teb->cur_stack + sizeof(*frame));
+}
 
 /* Pop bytes from the 16-bit stack of a thread */
-#define STACK16_POP(teb,size) \
- (memmove((char*)THREAD_STACK16(teb)+(size),THREAD_STACK16(teb), \
-          sizeof(STACK16FRAME)), \
-  (teb)->cur_stack += (size))
+static inline void WINE_UNUSED stack16_pop( int size )
+{
+    TEB *teb = NtCurrentTeb();
+    STACK16FRAME *frame = THREAD_STACK16(teb);
+    memmove( (char*)frame + size, frame, sizeof(*frame) );
+    teb->cur_stack += size;
+}
 
+#ifdef __i386__
 /* Push a DWORD on the 32-bit stack */
-#define STACK32_PUSH(context,val) (*--(*(DWORD **)&ESP_reg(context)) = (val))
+static inline void WINE_UNUSED stack32_push( CONTEXT *context, DWORD val )
+{
+    ESP_reg(context) -= sizeof(DWORD);
+    *(DWORD *)ESP_reg(context) = val;
+}
 
 /* Pop a DWORD from the 32-bit stack */
-#define STACK32_POP(context) (*(*(DWORD **)&ESP_reg(context))++)
+static inline DWORD WINE_UNUSED stack32_pop( CONTEXT *context )
+{
+    DWORD ret = *(DWORD *)ESP_reg(context);
+    ESP_reg(context) += sizeof(DWORD);
+    return ret;
+}
+#endif  /* __i386__ */
 
 /* Win32 register functions */
 #define REGS_FUNC(name) __regs_##name
diff --git a/loader/task.c b/loader/task.c
index 62f37a4b2e39e549b76eff21a71ab35221790459..0584a98b5fdaa53af4a2a6c9f93165e1ea6259de 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -255,8 +255,8 @@ void TASK_CallToStart(void)
     EDI_reg(&context) = pTask->hInstance;
     ESI_reg(&context) = pTask->hPrevInstance;
 
-    TRACE_(task)("Starting main program: cs:ip=%04lx:%04x ds=%04lx ss:sp=%04x:%04x\n",
-                  CS_reg(&context), IP_reg(&context), DS_reg(&context),
+    TRACE_(task)("Starting main program: cs:ip=%04lx:%04lx ds=%04lx ss:sp=%04x:%04x\n",
+                  CS_reg(&context), EIP_reg(&context), DS_reg(&context),
                   SELECTOROF(pTask->teb->cur_stack),
                   OFFSETOF(pTask->teb->cur_stack) );
 
@@ -736,9 +736,9 @@ void WINAPI InitTask16( CONTEXT86 *context )
      *
      * 0 (=%bp) is pushed on the stack
      */
-    ptr = STACK16_PUSH( pTask->teb, sizeof(WORD) );
+    ptr = stack16_push( sizeof(WORD) );
     *(WORD *)PTR_SEG_TO_LIN(ptr) = 0;
-    SP_reg(context) -= 2;
+    ESP_reg(context) -= 2;
 
     EAX_reg(context) = 1;
         
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 0d36bc5be38f6266613b17274a2a20c924011e9a..58574cc998219e0a7a578d92d9f5f923b055d2bf 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -644,6 +644,7 @@ static void StartPM( CONTEXT86 *context, LPDOSTASK lpDosTask )
 
 /* DPMI Raw Mode Switch handler */
 
+#if 0
 void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context )
 {
   LPDOSTASK lpDosTask = MZ_Current();
@@ -696,14 +697,17 @@ void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context )
   TRACE("re-entering protected mode at %04x:%08lx\n",
 	CS_sig(context), EIP_sig(context));
 }
+#endif
 
 #else
+#if 0
 void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context )
 {
   ERR("don't even think about DPMI raw mode switch without DOS support!\n");
   ExitProcess(1);
 }
 #endif
+#endif
 
 #define DOS_APP_ISDOS(addr,base) ((addr) < 0x110000)
 #define DOS_WINE_ISDOS(addr,base) (((addr) >= (base)) && ((addr) < (base) + 0x110000))
diff --git a/relay32/relay386.c b/relay32/relay386.c
index 16641c1467e8e8955e6532a8f896279e099db157..56c41267cfbd1ac13835d1348565557241e7edb0 100644
--- a/relay32/relay386.c
+++ b/relay32/relay386.c
@@ -235,7 +235,7 @@ void WINAPI REGS_FUNC(RELAY_CallFrom32Regs)( CONTEXT *context )
     WORD nb_args = *(WORD *)(relay_addr + 1) / sizeof(int);
 
     /* remove extra stuff from the stack */
-    EIP_reg(context) = STACK32_POP(context);
+    EIP_reg(context) = stack32_pop(context);
     args = (int *)ESP_reg(context);
     ESP_reg(context) += 4 * nb_args;
 
diff --git a/win32/kernel32.c b/win32/kernel32.c
index 73d098762a0fabd428feba66e0ee09b124e2c323..d851729da5b96f2071e7d10d0f9b2f3021a992c0 100644
--- a/win32/kernel32.c
+++ b/win32/kernel32.c
@@ -363,7 +363,7 @@ void WINAPI REGS_FUNC(FT_Prolog)( CONTEXT *context )
 {
 #ifdef __i386__
     /* Build stack frame */
-    STACK32_PUSH(context, EBP_reg(context));
+    stack32_push(context, EBP_reg(context));
     EBP_reg(context) = ESP_reg(context);
 
     /* Allocate 64-byte Thunk Buffer */
@@ -469,10 +469,10 @@ static void FT_Exit(CONTEXT *context, int nPopArgs)
 
     /* Clean up stack frame */
     ESP_reg(context) = EBP_reg(context);
-    EBP_reg(context) = STACK32_POP(context);
+    EBP_reg(context) = stack32_pop(context);
 
     /* Pop return address to CALLER of thunk code */
-    EIP_reg(context) = STACK32_POP(context);
+    EIP_reg(context) = stack32_pop(context);
     /* Remove arguments */
     ESP_reg(context) += nPopArgs;
 #endif
@@ -774,8 +774,8 @@ void WINAPI REGS_FUNC(FT_PrologPrime)( CONTEXT *context )
     ESP_reg(context) -= 4;
 
     /* Write FT_Prolog call stub */
-    targetTableOffset = STACK32_POP(context);
-    relayCode = (LPBYTE)STACK32_POP(context);
+    targetTableOffset = stack32_pop(context);
+    relayCode = (LPBYTE)stack32_pop(context);
     _write_ftprolog( relayCode, *(DWORD **)(relayCode+targetTableOffset) );
 
     /* Jump to the call stub just created */
@@ -946,7 +946,7 @@ void WINAPI REGS_FUNC(W32S_BackTo32)( CONTEXT *context )
     EAX_reg( context ) = proc( stack[1], stack[2], stack[3], stack[4], stack[5],
                                stack[6], stack[7], stack[8], stack[9], stack[10] );
 
-    EIP_reg( context ) = STACK32_POP(context);
+    EIP_reg( context ) = stack32_pop(context);
 #endif
 }