--- ./os2/os2ish.h-pre	Sun Aug  3 13:28:02 2003
+++ ./os2/os2ish.h	Tue Sep 16 20:58:12 2003
@@ -532,7 +532,7 @@ void init_PMWIN_entries(void);
 
 /* The expressions below return true on error. */
 /* INCL_DOSERRORS needed. rc should be declared outside. */
-#define CheckOSError(expr) (!(rc = (expr)) ? 0 : (FillOSError(rc), 1))
+#define CheckOSError(expr) ((rc = (expr)) ? (FillOSError(rc), rc) : 0)
 /* INCL_WINERRORS needed. */
 #define CheckWinError(expr) ((expr) ? 0: (FillWinError, 1))
 
@@ -681,6 +681,7 @@ enum entries_ordinals {
     ORD_WinFlashWindow,
     ORD_WinLoadPointer,
     ORD_WinQuerySysPointer,
+    ORD_DosReplaceModule,
     ORD_NENTRIES
 };
 
@@ -693,7 +694,7 @@ enum entries_ordinals {
 
 /* These functions return false on error, and save the error info in $^E */
 #define DeclOSFuncByORD(ret,name,o,at,args)	\
-  ret name at { unsigned long rc; return !CheckOSError(CallORD(ret,o,at,args)); }
+  ret name at { unsigned long rc; return CheckOSError(CallORD(ret,o,at,args)); }
 #define DeclWinFuncByORD(ret,name,o,at,args)	\
   ret name at { return SaveWinError(CallORD(ret,o,at,args)); }
 
--- ./os2/os2.c-pre	Sat Sep 13 14:26:24 2003
+++ ./os2/os2.c	Tue Sep 16 20:59:34 2003
@@ -619,6 +619,7 @@ static const struct {
   {&pmwin_handle, NULL, 745},		/* WinFlashWindow */
   {&pmwin_handle, NULL, 780},		/* WinLoadPointer */
   {&pmwin_handle, NULL, 828},		/* WinQuerySysPointer */
+  {&doscalls_handle, NULL, 417},	/* DosReplaceModule */
 };
 
 HMODULE
@@ -1828,6 +1829,46 @@ XS(XS_File__Copy_syscopy)
     XSRETURN(1);
 }
 
+/* APIRET APIENTRY DosReplaceModule (PCSZ pszOld, PCSZ pszNew, PCSZ pszBackup); */
+
+DeclOSFuncByORD(ULONG,replaceModule,ORD_DosReplaceModule,
+		(char *old, char *new, char *backup), (old, new, backup))
+
+XS(XS_OS2_replaceModule); /* prototype to pass -Wmissing-prototypes */
+XS(XS_OS2_replaceModule)
+{
+    dXSARGS;
+    if (items < 1 || items > 3)
+	Perl_croak(aTHX_ "Usage: OS2::replaceModule(target, source= Nullch, backup= Nullch)");
+    {
+	ULONG rc;
+	int	RETVAL;
+	dXSTARG;
+	char *	target = (char *)SvPV_nolen(ST(0));
+	char *	source;
+	char *	backup;
+
+	if (items < 2)
+	    source = Nullch;
+	else {
+	    source = (char *)SvPV_nolen(ST(1));
+	}
+
+	if (items < 3)
+	    backup = Nullch;
+	else {
+	    backup = (char *)SvPV_nolen(ST(2));
+	}
+
+	RETVAL = replaceModule(target, source, backup);
+	if (CheckOSError(RETVAL))
+	    croak_with_os2error("replaceModule() error");
+	XSprePUSH; PUSHi((IV)RETVAL);
+    }
+    XSRETURN(1);
+}
+
+
 #define PERL_PATCHLEVEL_H_IMPLICIT	/* Do not init local_patches. */
 #include "patchlevel.h"
 #undef PERL_PATCHLEVEL_H_IMPLICIT
@@ -3478,6 +3519,7 @@ Xs_OS2_init(pTHX)
         newXS("Cwd::sys_is_relative", XS_Cwd_sys_is_relative, file);
         newXS("Cwd::sys_cwd", XS_Cwd_sys_cwd, file);
         newXS("Cwd::sys_abspath", XS_Cwd_sys_abspath, file);
+        newXS("OS2::replaceModule", XS_OS2_replaceModule, file);
         newXSproto("OS2::_control87", XS_OS2__control87, file, "$$");
         newXSproto("OS2::get_control87", XS_OS2_get_control87, file, "");
         newXSproto("OS2::set_control87", XS_OS2_set_control87, file, ";$$");
