diff --git a/!DSMemCheck,fd7 b/!DSMemCheck,fd7
new file mode 100644
index 0000000000000000000000000000000000000000..bedb8583b84b268fc1198fa5123078d7679ee94f
--- /dev/null
+++ b/!DSMemCheck,fd7
@@ -0,0 +1,17 @@
+| Copyright 1998 Acorn Computers Ltd
+|
+| Licensed under the Apache License, Version 2.0 (the "License");
+| you may not use this file except in compliance with the License.
+| You may obtain a copy of the License at
+|
+|     http://www.apache.org/licenses/LICENSE-2.0
+|
+| Unless required by applicable law or agreed to in writing, software
+| distributed under the License is distributed on an "AS IS" BASIS,
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+| See the License for the specific language governing permissions and
+| limitations under the License.
+|
+Dir <Obey$Dir>
+wimpslot 2048k
+amu_machine ram THROWBACK=-throwback ASMBLOCKDRIVERS={FALSE} CCEXTRA="-g -fn" MEMCHECKCC="MemCheck.CC" MEMCHECKLD="MemCheck.DDTModLink"
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 62119d19c7dbb92b99d3d2975c532a1a87449d6b..5d1b0a47311fe5c9698027206f1beea5511d5611 100644
--- a/Makefile
+++ b/Makefile
@@ -32,16 +32,16 @@ EXP_HDR	=	<export$dir>
 #
 MKDIR =		cdir
 AS =		objasm
-CC =		cc
+CC =		${MEMCHECKCC} cc
 CMHG =		cmhg
 CP =		copy
-LD =		link
+LD =		${MEMCHECKLD} link
 RM =		remove
 MODSQZ =	modsqz
 WIPE =		-wipe
 
 ASMFLAGS =	-depend !Depend ${THROWBACK} -predefine "BlockDrivers SETL ${ASMBLOCKDRIVERS}"
-CFLAGS =	-depend !Depend ${THROWBACK} ${INCLUDES} ${CBLOCKDRIVERS} -strict -wP -ffah 
+CFLAGS =	-depend !Depend ${THROWBACK} ${INCLUDES} ${CBLOCKDRIVERS} -strict -wP -ffah ${CCEXTRA}
 CMHGFLAGS =	-depend !Depend ${THROWBACK} ${INCLUDES} ${CBLOCKDRIVERS} -p
 CPFLAGS =	~cfr~v
 WFLAGS =	~c~v
@@ -67,7 +67,8 @@ UNIXLIB   = TCPIPLibs:o.unixlibzm
 LIBS =\
  ${INETLIB}\
  ${SOCKLIB}\
- ${UNIXLIB}
+ ${UNIXLIB}\
+# MemCheck:o.MC_M\
 		
 
 LIBSD =\
diff --git a/VersionASM b/VersionASM
index 28f022ff53ea07439e8e5c54690a58b7f2678577..5692265ea8174f95bef94f1e51bfb37adf4aeaef 100644
--- a/VersionASM
+++ b/VersionASM
@@ -5,8 +5,8 @@
 			GBLA    Module_Version
 			GBLS	Module_MinorVersion
 			GBLS	Module_Date
-Module_MajorVersion	SETS    "1.19"
-Module_Version          SETA    1.19
+Module_MajorVersion	SETS    "1.20"
+Module_Version          SETA    120
 Module_MinorVersion	SETS	""
-Module_Date		SETS    "12 Mar 1998"
+Module_Date		SETS    "28 Apr 1998"
 		        END
diff --git a/VersionNum b/VersionNum
index 3d098ffbcc8fca921baaf4f00d8b3a445306eb05..c6a60faefe2ce32558b3e5b291d5bd374120a394 100644
--- a/VersionNum
+++ b/VersionNum
@@ -1,14 +1,14 @@
-/* (1.19)
+/* (1.20)
  *
  * This file is automatically maintained by srccommit, do not edit manually.
  *
  */
-#define Module_MajorVersion_CMHG     	1.19
+#define Module_MajorVersion_CMHG     	1.20
 #define Module_MinorVersion_CMHG	
-#define Module_Date_CMHG      		12 Mar 1998
+#define Module_Date_CMHG      		28 Apr 1998
 
-#define Module_MajorVersion     	"1.19"
-#define Module_Version                  1.19
+#define Module_MajorVersion     	"1.20"
+#define Module_Version                  120
 #define Module_MinorVersion		""
-#define Module_Date      		"12 Mar 1998"
+#define Module_Date      		"28 Apr 1998"
 
diff --git a/c/if_ppp b/c/if_ppp
index 63a911e807f9c1c07d61a01eb98a360fb2845699..0102f2403c2ce7842054497a10c5d6941339fc13 100644
--- a/c/if_ppp
+++ b/c/if_ppp
@@ -140,6 +140,7 @@ static char *ack_if_ppp="Copyright (c) 1989 Carnegie Mellon University. "
 
 #include "pppd/minixlib.h"
 #include "pppd/main.h"
+#include "MemCheck/MemCheck.h"
 
 
 
@@ -304,11 +305,17 @@ void pppclose(int fd)
     /* Do some sort of buffer flush/ serial close */
     s = splimp();		/* paranoid; splnet probably ok */
     serial_finalise();
-                    MBCTL.freem(&MBCTL, sc->sc_outm);
-                    sc->sc_outm = NULL;
-                    MBCTL.freem(&MBCTL, sc->sc_m);
-                    sc->sc_m = NULL;
-                    pppdealloc(sc);
+
+    MBCTL.freem(&MBCTL, sc->sc_outm);
+    sc->sc_outm = NULL;
+    if (sc->sc_m)
+    {
+        MRESET(sc->sc_m);
+        free(mtod(sc->sc_m, void *));
+        MBCTL.freem(&MBCTL, sc->sc_m);
+        sc->sc_m = NULL;
+    }
+    pppdealloc(sc);
 
 
     unsplimp(s);
@@ -351,6 +358,7 @@ int pppread(int fd, u_char *p, int n)
 /*
  * Line specific (tty) write routine.
  */
+
 int pppwrite(int s, u_char *p, int nbytes)
 {
     struct ppp_softc *sc = &ppp_softc[s];
@@ -808,6 +816,7 @@ static struct mbuf *ppp_dequeue(struct ppp_softc *sc)
 	/* If the first mbuf is < or smaller than a PPP header, skip
 	   to the next one
 	 */
+
 	if (mp->m_len <= PPP_HDRLEN)
 	{
 	    mp = mp->m_next;
@@ -953,12 +962,16 @@ _kernel_oserror *start_handler(_kernel_swi_regs *r, void *pw)
 
     _kernel_irqs_on();
 
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
     pdebug ((LOG_DEBUG, "in_pppstart: %d", in_pppstart));
     if (!in_pppstart)
         pppstart(0);
    /* else
         serial_enableevents();*/
 
+    MemCheck_UnRegisterMiscBlock (r);
+
     return (NULL);
 
     NOT_USED (r);
@@ -1222,6 +1235,7 @@ void pppstart(int fd)
 /*
  * Allocate enough mbuf to handle current MRU.
  */
+
 static int pppgetm(struct ppp_softc *sc)
 {
     int len = HDROFF + sc->sc_mru + PPP_HDRLEN + PPP_FCSLEN;
@@ -1255,6 +1269,8 @@ static int pppgetm(struct ppp_softc *sc)
     return 1;
 }
 
+
+
 /*
  * PPP packet input routine.
  * The caller has checked and removed the FCS.
@@ -1564,7 +1580,9 @@ void pppinput(int c, int fd)
 
         /* Paranoia */
         if (!m)
+        {
             return;
+        }
 
         m->m_type = 0; /* Mark packet as unread */
         m->m_len = 0;
diff --git a/c/pppmodule b/c/pppmodule
index dcabee9594d0673961354366dab39707b64f0f85..ff6494d0eeadb8d4cbf9ee16d4b9c1205bb8ff78 100644
--- a/c/pppmodule
+++ b/c/pppmodule
@@ -72,6 +72,8 @@
   #include "Trace.Trace.h"
 #endif
 
+#include "MemCheck/MemCheck.h"
+
 
 #define PPP_AlterSettings_Timeout        0
 
@@ -177,10 +179,12 @@ static _kernel_oserror *ppp_error(int error)
 /*
  * freelist - free an mbuf list
  */
+
 void freelist(struct mbuf *m0)
 {
     struct mbuf *m;
 
+
     while (m0)
     {
         m=m0->m_list;
@@ -324,22 +328,29 @@ static int do_singlefilter(_kernel_swi_regs *r)
     int unit = r->r[1];
     FilterSingleRef fs = ppp_softc[unit].inetfilter;
 
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
     /*
      * check whether claiming or releasing
      */
     if (r->r[0] & FILTER_RELEASE)
     {
 	if (!fs)
+	{
 	    /*
 	     * trying to free a non-existent claim
 	     */
+	    MemCheck_UnRegisterMiscBlock (r);
 	    return EINVAL;
+	}
 
 	if (fs->fs_handler != (void (*)())r->r[6] || fs->fs_pwptr != r->r[5])
+	{
 	    /*
 	     * trying to release somebody else's claim
 	     */
+	    MemCheck_UnRegisterMiscBlock (r);
 	    return EPERM;
+	}
 
 	/*
 	 * everything checks out, do the free
@@ -376,17 +387,20 @@ static int do_singlefilter(_kernel_swi_regs *r)
 		 * we can bring the card up live once again.
 		 */
 		if( (error = enioctl(unit, 1, 1)) != 0 )
+		{
 		    /*
 		     * return an error, but *do not* free the structure
 		     */
+		    MemCheck_UnRegisterMiscBlock (r);
 		    return error;
+		}
 
 		/*
 		 * set receive level for this unit to the
 		 * loosest address filtering necessary.
 		 */
 		update_addrlevel(unit);
-
+		MemCheck_UnRegisterMiscBlock (r);
 		return 0;
 	    }
 	    else
@@ -394,14 +408,18 @@ static int do_singlefilter(_kernel_swi_regs *r)
 		/*
 		 * this frame level is already claimed in some fashion
 		 */
+		MemCheck_UnRegisterMiscBlock (r);
 		return(INETERR_FILTERGONE);
 	}
 
 	if( (fs = (FilterSingleRef)malloc(sizeof(*fs))) == NULL )
+	{
 	    /*
 	     * cannot claim memory for this structure
 	     */
+	    MemCheck_UnRegisterMiscBlock (r);
 	    return(ENOMEM);
+	}
 
 	/*
 	 * check that we can bring the card up live
@@ -428,6 +446,7 @@ static int do_singlefilter(_kernel_swi_regs *r)
     }
 
     /* all OK */
+    MemCheck_UnRegisterMiscBlock (r);
     return(0);
 }
 
@@ -474,11 +493,19 @@ static void stats_init(void)
 
 static int ppp_filter(_kernel_swi_regs *r)
 {
-    int flags=r->r[0];
-    int unit=r->r[1];
-    int frametype=r->r[2];
-    int addrlevel=r->r[3];
-    int errlevel=r->r[4];
+    int flags;
+    int unit;
+    int frametype;
+    int addrlevel;
+    int errlevel;
+
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
+    flags     = r->r[0];
+    unit      = r->r[1];
+    frametype = r->r[2];
+    addrlevel = r->r[3];
+    errlevel  = r->r[4];
 
     pdebug ((LOG_DEBUG,
              "PPP_Filter: flags=%d unit=%d frametype=%d addrlevel=%d errlevel=%d\n",
@@ -491,16 +518,23 @@ static int ppp_filter(_kernel_swi_regs *r)
         unit >= NPPP ||
        !check_addrlevel(addrlevel) ||
        !check_errlevel(errlevel) )
+    {
+	MemCheck_UnRegisterMiscBlock (r);
 	return(EINVAL);
+    }
 
     /*
      * now check type and level
      */
     if( (GET_FRAMELEVEL(frametype)) != FRMLVL_E2SPECIFIC ||
         (GET_FRAMETYPE(frametype)) != ETHERTYPE_IP )
+    {
+	MemCheck_UnRegisterMiscBlock (r);
 	return(EINVAL);
+    }
 
     /* that's all */
+    MemCheck_UnRegisterMiscBlock (r);
     return(do_singlefilter(r));
 }
 
@@ -508,10 +542,15 @@ static int ppp_filter(_kernel_swi_regs *r)
 
 static int ppp_version(_kernel_swi_regs *r)
 {
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
     if( r->r[0] )
+    {
+	MemCheck_UnRegisterMiscBlock (r);
 	return(EINVAL);
+    }
 
     r->r[1] = DCIVERSION;
+    MemCheck_UnRegisterMiscBlock (r);
     return (0);
 }
 
@@ -519,11 +558,16 @@ static int ppp_version(_kernel_swi_regs *r)
 
 static int ppp_inquire(_kernel_swi_regs *r)
 {
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
     if( r->r[0] )
+    {
+	MemCheck_UnRegisterMiscBlock (r);
 	return(EINVAL);
+    }
 
     r->r[2] = ppp_softc[r->r[1]].dib.dib_inquire;
 
+    MemCheck_UnRegisterMiscBlock (r);
     return(0);
 }
 
@@ -531,14 +575,23 @@ static int ppp_inquire(_kernel_swi_regs *r)
 
 static int ppp_getmtu(_kernel_swi_regs *r)
 {
-    int flags=r->r[0];
-    int unit=r->r[1];
+    int flags;
+    int unit;
+
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
+    flags = r->r[0];
+    unit  = r->r[1];
 
     if (flags || unit < 0 || unit >= NPPP)
+    {
+	MemCheck_UnRegisterMiscBlock (r);
 	return EINVAL;
+    }
 
     r->r[2] = ppp_softc[unit].sc_mtu;
 
+    MemCheck_UnRegisterMiscBlock (r);
     return 0;
 }
 
@@ -546,14 +599,23 @@ static int ppp_getmtu(_kernel_swi_regs *r)
 
 static int ppp_setmtu(_kernel_swi_regs *r)
 {
-    int flags=r->r[0];
-    int unit=r->r[1];
+    int flags;
+    int unit;
+
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
+    flags = r->r[0];
+    unit  = r->r[1];
 
     if (flags || unit < 0 || unit >= NPPP)
+    {
+	MemCheck_UnRegisterMiscBlock (r);
 	return EINVAL;
+    }
 
     ppp_softc[unit].sc_mtu=r->r[2];
 
+    MemCheck_UnRegisterMiscBlock (r);
     return 0;
 }
 
@@ -569,27 +631,39 @@ int rxerrors;
 static int ppp_transmit(_kernel_swi_regs *r)
 {
     const static struct sockaddr dst={AF_INET}; /* Bodge! */
-    unsigned flags=r->r[0];
-    int unit=r->r[1];
-    unsigned type=r->r[2];
-    struct mbuf *m0=(struct mbuf *)r->r[3], *md, *md1, *m1, **m2, *temp;
+    unsigned flags;
+    int unit;
+    unsigned type;
+    struct mbuf *m0, *md, *md1, *m1, **m2, *temp;
     int error=0;
-#ifdef DEBUG
-    int packet_len, packet_count;
 
-    for (m0 = (struct mbuf *)r->r[3], packet_count = 1;
-         m0;
-         m0 = m0->m_list, packet_count++)
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
+    flags = r->r[0];
+    unit  = r->r[1];
+    type  = r->r[2];
+    m0    = (struct mbuf *) r->r[3];
+
+#ifdef DEBUG
     {
-        for (m1 = m0, packet_len = 0; m1; m1 = m1->m_next)
+        int packet_len, packet_count;
+        struct mbuf *  debug_m0;
+        struct mbuf *  debug_m1;
+
+        for (debug_m0 = (struct mbuf *)r->r[3], packet_count = 1;
+             debug_m0;
+             debug_m0 = debug_m0->m_list, packet_count++)
         {
-            packet_len += m1->m_len;
-        }
+            for (debug_m1 = debug_m0, packet_len = 0;
+                 debug_m1;
+                 debug_m1 = debug_m1->m_next)
+            {
+                packet_len += debug_m1->m_len;
+            }
 
-        syslog (LOG_DEBUG, "Packet %d length: %d", packet_count, packet_len);
+            syslog (LOG_DEBUG, "Packet %d length: %d", packet_count, packet_len);
+        }
     }
-
-    m0=(struct mbuf *)r->r[3];
 #endif
 
 
@@ -602,6 +676,7 @@ static int ppp_transmit(_kernel_swi_regs *r)
         if (!(flags & TX_PROTOSDATA))
             freelist(m0);
 
+	MemCheck_UnRegisterMiscBlock (r);
         return error;
     }
 #if 0
@@ -678,6 +753,7 @@ static int ppp_transmit(_kernel_swi_regs *r)
     else
         error=pppoutput(&ppp_softc[unit].dib, md, &dst);
 
+    MemCheck_UnRegisterMiscBlock (r);
     return error;
 }
 
@@ -685,11 +761,17 @@ static int ppp_transmit(_kernel_swi_regs *r)
 
 static int ppp_stats(_kernel_swi_regs *r)
 {
-    unsigned flags=r->r[0];
-    int unit=r->r[1];
-    struct stats *output=(struct stats *) r->r[2];
+    unsigned flags;
+    int unit;
+    struct stats *output;
     const struct stats *ps;
 
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
+    flags  = r->r[0];
+    unit   = r->r[1];
+    output = (struct stats *) r->r[2];
+
     switch (flags)
     {
         case 0:
@@ -701,11 +783,13 @@ static int ppp_stats(_kernel_swi_regs *r)
             break;
 
         default:
+            MemCheck_UnRegisterMiscBlock (r);
             return EINVAL;
     }
 
     memcpy(output, ps, sizeof(struct stats));
 
+    MemCheck_UnRegisterMiscBlock (r);
     return 0;
 }
 
@@ -713,8 +797,11 @@ static int ppp_stats(_kernel_swi_regs *r)
 
 static _kernel_oserror *ppp_alter_settings (_kernel_swi_regs *r)
 {
-    unsigned int reason_code = (unsigned int) r->r[0];
+    unsigned int reason_code;
+
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
 
+    reason_code = r->r[0];
 
     switch (reason_code)
     {
@@ -727,6 +814,7 @@ static _kernel_oserror *ppp_alter_settings (_kernel_swi_regs *r)
             {
                 _ppp_errblk.errnum = 0;
                 strcpy (_ppp_errblk.errmess, "PPP: bad idle time limit");
+                MemCheck_UnRegisterMiscBlock (r);
                 return (&_ppp_errblk);
             }
 
@@ -746,10 +834,12 @@ static _kernel_oserror *ppp_alter_settings (_kernel_swi_regs *r)
         default:
             _ppp_errblk.errnum = 0;
             strcpy (_ppp_errblk.errmess, "PPP: bad reason code");
+            MemCheck_UnRegisterMiscBlock (r);
             return (&_ppp_errblk);
             break;
     }
 
+    MemCheck_UnRegisterMiscBlock (r);
     return NULL;
 }
 
@@ -757,9 +847,12 @@ static _kernel_oserror *ppp_alter_settings (_kernel_swi_regs *r)
 
 static _kernel_oserror *ppp_status (_kernel_swi_regs *r)
 {
-    unsigned int reason_code = (unsigned int) r->r[0];
+    unsigned int reason_code;
     int interrupt_status;
 
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
+    reason_code = r->r[0];
 
     switch (reason_code)
     {
@@ -787,10 +880,12 @@ static _kernel_oserror *ppp_status (_kernel_swi_regs *r)
         default:
             _ppp_errblk.errnum = 0;
             strcpy (_ppp_errblk.errmess, "PPP: bad reason code");
+            MemCheck_UnRegisterMiscBlock (r);
             return (&_ppp_errblk);
             break;
     }
 
+    MemCheck_UnRegisterMiscBlock (r);
     return NULL;
 }
 
@@ -865,6 +960,79 @@ static void trace_exit (const char *fn)
 
 #endif
 
+
+
+
+#ifdef MemCheck_MEMCHECK
+
+static char    memcheck_buffer[1024 * 100];
+static char *  memcheck_ptr = memcheck_buffer;
+static FILE *  memcheck_out = 0;
+
+static int  memcheck_vprintf (void *        reference,
+                              const char *  format,
+                              va_list       args)
+{
+    int          n = 0;
+
+    if (memcheck_ptr < (memcheck_buffer + sizeof (memcheck_buffer)))
+    {
+        n = vsprintf (memcheck_ptr,
+                      format,
+                      args);
+        if (n > 0)
+        {
+            memcheck_ptr += n;
+        }
+    }
+    else
+    {
+        n = 0;
+    }
+
+    return n;
+}
+
+_kernel_oserror *  memcheck_output (_kernel_swi_regs *  r,
+                                    void *              pw)
+{
+    r = r;
+    pw = pw;
+
+    memcheck_out = fopen ("$.PPPMemCheck",
+                          "a+");
+    if (memcheck_out)
+    {
+        fwrite (memcheck_buffer,
+                1,
+                memcheck_ptr - memcheck_buffer,
+                memcheck_out);
+
+        fclose (memcheck_out);
+        memcheck_ptr = memcheck_buffer;
+    }
+
+    return NULL;
+}
+
+_kernel_oserror *  memcheck_callevery (_kernel_swi_regs *  r,
+                                       void *              pw)
+{
+    r = r;
+    pw = pw;
+
+    _swix (OS_AddCallBack,
+           _INR (0, 1),
+           memcheck_output_entry,
+           pw);
+
+    return NULL;
+}
+
+#endif
+
+
+
 /*
  * Module Initialisation code.
  */
@@ -885,6 +1053,28 @@ _kernel_oserror *ppp_initialise(const char *cmd_tail, int pbase, void *pw)
     finalising=0;
 #   endif
 
+
+    MemCheck_Init ();
+    MemCheck_RedirectToFunction (memcheck_vprintf, 0);
+    MemCheck_SetStoreMallocFunctions (1);
+    MemCheck_InterceptSCLStringFunctions();
+    MemCheck_SetQuitting (0, 0);
+    MemCheck_SetAccessQuitting (0, 0);
+    /* Don't output blocks on every diagnostic.  Alot of diagnostics are produced
+     * because of MemCheck faulting accesses to externally supplied mbuf data structures.
+     * There are too many instances of these to make it feasible to register them all as
+     * misc blocks.
+     */
+    MemCheck_SetAutoOutputBlocksInfo (0);
+
+#ifdef MemCheck_MEMCHECK
+    _swix (OS_CallEvery,
+           _INR (0, 2),
+           99,
+           memcheck_callevery_entry,
+           pw);
+#endif
+
     /*if( (error = ppp_init()) != 0 )
 	return(ppp_error(error));*/
 
@@ -1002,6 +1192,23 @@ _kernel_oserror *ppp_quit(int fatal, int podule, void *pw)
     /* Paranoia */
     serial_finalise();
 
+#ifdef MemCheck_MEMCHECK
+
+    _swix (OS_RemoveTickerEvent,
+           _INR (0, 1),
+           memcheck_callevery_entry,
+           pw);
+
+    _swix (OS_RemoveCallBack,
+           _INR (0, 1),
+           memcheck_output,
+           pw);
+
+    MemCheck_OutputBlocksInfo ();
+    memcheck_output (NULL, NULL);
+
+#endif
+
     return NULL;
 
     NOT_USED (fatal);
@@ -1016,6 +1223,7 @@ _kernel_oserror *ppp_quit(int fatal, int podule, void *pw)
  */
 static void handle_managerstatus(_kernel_swi_regs *r)
 {
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
     switch( r->r[0] )
     {
       case MbufManagerStatus_Started:
@@ -1057,6 +1265,7 @@ static void handle_managerstatus(_kernel_swi_regs *r)
       default:
 	break;
     }
+    MemCheck_UnRegisterMiscBlock (r);
 }
 
 /**********************************************************************/
@@ -1066,6 +1275,8 @@ void ppp_sc_handler(int sn, _kernel_swi_regs *r, void *pw)
 {
     NOT_USED (pw);
 
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
+
     if ((dialler_flags & DiallerFlags_UsingDialler) &&
         (sn == Service_DiallerStatus || sn == Service_DiallerBStatus))
     {
@@ -1137,6 +1348,7 @@ void ppp_sc_handler(int sn, _kernel_swi_regs *r, void *pw)
 	    break;
 	}
     }
+    MemCheck_UnRegisterMiscBlock (r);
 }
 
 /**********************************************************************/
@@ -1149,6 +1361,7 @@ _kernel_oserror *ppp_swi_handler(int swinum, _kernel_swi_regs *r, void *pw)
     struct swient *callp;
     int error, oldstate;
 
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
     NOT_USED(pw);
 
     /*
@@ -1167,7 +1380,10 @@ _kernel_oserror *ppp_swi_handler(int swinum, _kernel_swi_regs *r, void *pw)
      * given for all SWIs other than Version
      */
     if( swinum != DCI4Version && r->r[1] >= pppcnt  )
+    {
+        MemCheck_UnRegisterMiscBlock (r);
         return(ppp_error(ENXIO));
+    }
 
     pdebug ((LOG_DEBUG, "\021\06SWI %x...", swinum & 63));
 
@@ -1190,9 +1406,11 @@ _kernel_oserror *ppp_swi_handler(int swinum, _kernel_swi_regs *r, void *pw)
                 break;
 
             default:
+                MemCheck_UnRegisterMiscBlock (r);
                 return error_BAD_SWI;
         }
 
+        MemCheck_UnRegisterMiscBlock (r);
         return e;
     }
 
@@ -1203,6 +1421,7 @@ _kernel_oserror *ppp_swi_handler(int swinum, _kernel_swi_regs *r, void *pw)
 
     pdebug ((LOG_DEBUG, "error %d\021\07\n", error));
 
+    MemCheck_UnRegisterMiscBlock (r);
     return(ppp_error(error));
 }
 
@@ -1427,11 +1646,14 @@ _kernel_oserror *ppp_cli_handler(const char *arg_string, int arg_count,
     _kernel_oserror *e;
 
 
+    MemCheck_RegisterMiscBlock_String (arg_string);
+
     if( cmd_no >= sizeof(ppp_cli_call) / sizeof(ppp_cli_call[0]) )
     {
         _ppp_errblk.errnum = 42;
         sprintf(_ppp_errblk.errmess, "PPP: bad command number: %d\n",
                 cmd_no);
+        MemCheck_UnRegisterMiscBlock (arg_string);
         return &_ppp_errblk;
     }
 
@@ -1456,6 +1678,7 @@ _kernel_oserror *ppp_cli_handler(const char *arg_string, int arg_count,
             _ppp_errblk.errnum = 0;
             strcpy (_ppp_errblk.errmess,
                     "PPP: not enough memory to make copy of argument string\n");
+            MemCheck_UnRegisterMiscBlock (arg_string);
             return &_ppp_errblk;
         }
 
@@ -1518,6 +1741,7 @@ _kernel_oserror *ppp_cli_handler(const char *arg_string, int arg_count,
             _swix(OS_Write0, _IN(0), usage_string);
             _swix(OS_PrettyPrint, _INR(0,1),
                          "\rSyntax: *PPPConnect [arguments]", 0);
+            MemCheck_UnRegisterMiscBlock (arg_string);
             return NULL;
 
           case CMD_PPPDisconnect:
@@ -1531,15 +1755,18 @@ _kernel_oserror *ppp_cli_handler(const char *arg_string, int arg_count,
             break;
 
           default:
+            MemCheck_UnRegisterMiscBlock (arg_string);
             return NULL;
         }
 
+        MemCheck_UnRegisterMiscBlock (arg_string);
         return help_PRINT_BUFFER;
     }
 
     callp = &ppp_cli_call[cmd_no];
     e = callp->cli_call(margc, margv);
     free (w_arg_string);
+    MemCheck_UnRegisterMiscBlock (arg_string);
     return e;
 
     NOT_USED(pw);
diff --git a/c/serial b/c/serial
index 63203a98086719b99707aa89eae8d32b5dc049ec..76b1b4aadd903fd9d0b69b436c5fd78dd92ee860 100644
--- a/c/serial
+++ b/c/serial
@@ -57,6 +57,7 @@
 #include "serial.h"
 
 #include "dialler.h"
+#include "MemCheck/MemCheck.h"
 
 #define TickerV 0x1C
 #define UpCallV 0x1D
@@ -763,6 +764,7 @@ _kernel_oserror *serial_initialise(struct ppp_softc *sc)
 extern unsigned int get_pc (void);
 int upcall_handler (_kernel_swi_regs *r, void *pw)
 {
+    MemCheck_RegisterMiscBlock (r, sizeof (_kernel_swi_regs));
     switch (r->r[0])
     {
         case 15:    /* DeviceRxDataPresent */
@@ -770,6 +772,7 @@ int upcall_handler (_kernel_swi_regs *r, void *pw)
             /* Only interested in the serial input stream */
             if (r->r[1] != serial_in)
             {
+                MemCheck_UnRegisterMiscBlock (r);
                 return (1);    /* Pass on the call */
             }
 
@@ -779,8 +782,8 @@ int upcall_handler (_kernel_swi_regs *r, void *pw)
 
         case 16:    /* DeviceThresAbove */
             pdebug ((LOG_DEBUG, "DeviceThresAbove (%d)", r->r[1]));
+            MemCheck_UnRegisterMiscBlock (r);
             return (1);    /* Pass on call */
-            break;
 
 
         case 17:    /* DeviceThresBelow */
@@ -789,7 +792,8 @@ int upcall_handler (_kernel_swi_regs *r, void *pw)
             /* Only interested in the serial output stream */
             if (r->r[1] != serial_out)
             {
-                return (1);    /* Pass on the call */
+                 MemCheck_UnRegisterMiscBlock (r);
+                 return (1);    /* Pass on the call */
             }
 
             if (serialevents_active)
@@ -816,9 +820,11 @@ int upcall_handler (_kernel_swi_regs *r, void *pw)
             break;
 
         default:
+            MemCheck_UnRegisterMiscBlock (r);
             return (1);    /* Pass on call */
     }
 
+    MemCheck_UnRegisterMiscBlock (r);
     return (0);    /* Intercept call */
 }
 
diff --git a/cmhg/PPPHdr b/cmhg/PPPHdr
index 8d701d8da9ed8d7c0953c3b14e5dd3a4ed5316e1..84e362241c15ee948fd35742f030384da594a7ef 100644
--- a/cmhg/PPPHdr
+++ b/cmhg/PPPHdr
@@ -47,6 +47,10 @@ generic-veneers:	poll_entry/poll_handler,
 			term_entry/term_handler,
 			hupcheck_entry/hupcheck_handler
 
+// For MemCheck builds, add the following two generic veneers
+//			memcheck_callevery_entry/memcheck_callevery,
+//			memcheck_output_entry/memcheck_output
+
 #ifndef BLOCKDRIVERS
 vector-handlers:	upcall_entry/upcall_handler
 #endif
diff --git a/pppd/Makefile b/pppd/Makefile
index bdd8a9d8615ceb1b3d9261fd6b67f3532c5b7288..51f6d0a1746753fa42498792e312311298c57501 100644
--- a/pppd/Makefile
+++ b/pppd/Makefile
@@ -27,7 +27,7 @@
 #
 MKDIR =		cdir
 AS =		objasm
-CC =		cc
+CC =		${MEMCHECKCC} cc
 CMHG =		cmhg
 CP =		copy
 LD =		link
@@ -36,7 +36,7 @@ MODSQZ =	modsqz
 WIPE =		-wipe
 
 ASMFLAGS =	-depend !Depend ${THROWBACK}
-CFLAGS =	-depend !Depend ${THROWBACK} ${INCLUDES} ${CBLOCKDRIVERS} -strict -Wp -ffah 
+CFLAGS =	-depend !Depend ${THROWBACK} ${INCLUDES} ${CBLOCKDRIVERS} -strict -Wp -ffah ${CCEXTRA} 
 CPFLAGS =	~cfr~v
 LDFLAGS =	-aof
 WFLAGS =	~c~v
diff --git a/pppd/c/auth b/pppd/c/auth
index 11d5f90bb8ea7c105ec053407be7a30e116875a3..fce1a82ada457bc74fddc0a109470641bbecc5c6 100644
--- a/pppd/c/auth
+++ b/pppd/c/auth
@@ -32,6 +32,10 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+#ifdef MemCheck_MEMCHECK
+#pragma -c0
+#endif
+
 static char *ack_auth =
     "Copyright (c) 1993 The Australian National University. "
     "All rights reserved.";
diff --git a/pppd/c/ipcp b/pppd/c/ipcp
index 01a47197a2073941ee02fc063dc626ca425ab575..aa0dc712bf3bc45333cd8242ffbc8245e94d1f03 100644
--- a/pppd/c/ipcp
+++ b/pppd/c/ipcp
@@ -21,6 +21,10 @@
  * TODO:
  */
 
+#ifdef MemCheck_MEMCHECK
+#pragma -c0
+#endif
+
 /* Carnegie Mellon acknowledged in c.if_ppp */
 
 #include <stdio.h>
diff --git a/pppd/c/lcp b/pppd/c/lcp
index 69130e6501f5e1b792ac2f60991040ba9ea24e5e..ea2669589dfafe5def7f0cef1b7bfd6fdc6beff9 100644
--- a/pppd/c/lcp
+++ b/pppd/c/lcp
@@ -21,6 +21,11 @@
  * TODO:
  */
 
+
+#ifdef MemCheck_MEMCHECK
+#pragma -c0
+#endif
+
 /* Carnegie Mellon acknowledged in c.if_ppp */
 
 #include <stdio.h>
@@ -357,6 +362,7 @@ void lcp_sprotrej(int unit, u_char *p, int len)
 /*
  * lcp_resetci - Reset our CI.
  */
+
 static void lcp_resetci(fsm *f)
 {
     lcp_wantoptions[f->unit].magicnumber = magic();
@@ -369,6 +375,7 @@ static void lcp_resetci(fsm *f)
 /*
  * lcp_cilen - Return length of our CI.
  */
+
 static int lcp_cilen(fsm *f)
 {
     lcp_options *go = &lcp_gotoptions[f->unit];
@@ -392,10 +399,10 @@ static int lcp_cilen(fsm *f)
 	    LENCIVOID(go->neg_accompression));
 }
 
-
 /*
  * lcp_addci - Add our desired CIs to a packet.
  */
+
 static void lcp_addci(fsm *f, u_char *ucp, int *lenp)
 {
     lcp_options *go = &lcp_gotoptions[f->unit];
@@ -448,7 +455,6 @@ static void lcp_addci(fsm *f, u_char *ucp, int *lenp)
     }
 }
 
-
 /*
  * lcp_ackci - Ack our CIs.
  * This should not modify any state if the Ack is bad.
@@ -1608,3 +1614,7 @@ static void lcp_echo_lowerdown(int unit)
         lcp_echo_timer_running = 0;
     }
 }
+
+#ifdef MemCheck_MEMCHECK
+#pragma -c1
+#endif
diff --git a/pppd/c/options b/pppd/c/options
index e864185f79db68e65c36579ca09029a77e8b4763..4c29387ca1f6f5a537afe6efef4befbccbcc8294 100644
--- a/pppd/c/options
+++ b/pppd/c/options
@@ -407,7 +407,7 @@ int getword(FILE *f, char *word, int *newlinep, char *filename)
     /*
      * First skip white-space and comments
      */
-    while ((c = getc(f)) != EOF) {
+    while ((c = fgetc(f)) != EOF) {
 	if (c == '\\') {
 	    /*
 	     * \<newline> is ignored; \ followed by anything else
@@ -423,7 +423,7 @@ int getword(FILE *f, char *word, int *newlinep, char *filename)
 	    *newlinep = 1;	/* next word starts a line */
 	else if (c == '#') {
 	    /* comment - ignore until EOF or \n */
-	    while ((c = getc(f)) != EOF && c != '\n')
+	    while ((c = fgetc(f)) != EOF && c != '\n')
 		;
 	    if (c == EOF)
 		break;
@@ -470,8 +470,9 @@ int getword(FILE *f, char *word, int *newlinep, char *filename)
 	    if (c == '\\')
 		escape = 1;
 	}
-	if ((c = getc(f)) == EOF)
+        if ((c = fgetc (f)) == EOF)
 	    break;
+
     }
 
     if (ferror(f)) {