diff --git a/dlls/winedos/relay.c b/dlls/winedos/relay.c
index fa609ad29011159635260a557d6f349f085cef5b..a42b46422244969d650fbcb73a3dada806fbedc7 100644
--- a/dlls/winedos/relay.c
+++ b/dlls/winedos/relay.c
@@ -103,12 +103,37 @@ static void RELAY_MakeShortContext( CONTEXT86 *context )
  * This stub is called by __wine_call_from_16_regs in order to marshall
  * relay parameters.
  */
-static void __stdcall RELAY_RelayStub( DOSRELAY proc, 
+static void __stdcall RELAY_RelayStub( DOSRELAY       proc, 
                                        unsigned char *args, 
-                                       void *context )
+                                       void          *ctx86 )
 {
     if (proc)
-        proc( (CONTEXT86*)context, *(LPVOID *)args );
+    {
+        CONTEXT86     *context    = (CONTEXT86*)ctx86;
+        RELAY_Stack16 *stack      = RELAY_GetPointer( context->Esp );
+
+        DWORD          old_seg_cs = context->SegCs;
+        DWORD          old_eip    = context->Eip;
+        DWORD          old_seg_ss = context->SegSs;
+        DWORD          old_esp    = context->Esp;
+
+        context->SegCs = stack->seg_cs;
+        context->Eip   = stack->eip;
+        context->SegSs = stack->seg_ss;
+        context->Esp   = stack->esp;
+
+        proc( context, *(LPVOID *)args );
+
+        stack->seg_cs = context->SegCs;
+        stack->eip    = context->Eip;
+        stack->seg_ss = context->SegSs;
+        stack->esp    = context->Esp;
+
+        context->SegCs = old_seg_cs;
+        context->Eip   = old_eip;
+        context->SegSs = old_seg_ss;
+        context->Esp   = old_esp;
+    }
 }