diff --git a/VersionASM b/VersionASM
index 2d4a97c308bdf0058efa98534f1862ec126a88df..21ae89b4541fd04260af4e48db031cba7f45b994 100644
--- a/VersionASM
+++ b/VersionASM
@@ -13,11 +13,11 @@
                         GBLS    Module_ComponentPath
 Module_MajorVersion     SETS    "5.35"
 Module_Version          SETA    535
-Module_MinorVersion     SETS    "4.79.2.49"
-Module_Date             SETS    "16 Oct 2002"
-Module_ApplicationDate  SETS    "16-Oct-02"
+Module_MinorVersion     SETS    "4.79.2.50"
+Module_Date             SETS    "28 Oct 2002"
+Module_ApplicationDate  SETS    "28-Oct-02"
 Module_ComponentName    SETS    "Kernel"
 Module_ComponentPath    SETS    "RiscOS/Sources/Kernel"
-Module_FullVersion      SETS    "5.35 (4.79.2.49)"
-Module_HelpVersion      SETS    "5.35 (16 Oct 2002) 4.79.2.49"
+Module_FullVersion      SETS    "5.35 (4.79.2.50)"
+Module_HelpVersion      SETS    "5.35 (28 Oct 2002) 4.79.2.50"
                         END
diff --git a/VersionNum b/VersionNum
index d4904f6971c1c13665d848e8f830d34a9785d1f0..11023ed8a14591a7149e5d8fe5001ef2fdb231cf 100644
--- a/VersionNum
+++ b/VersionNum
@@ -5,19 +5,19 @@
  *
  */
 #define Module_MajorVersion_CMHG        5.35
-#define Module_MinorVersion_CMHG        4.79.2.49
-#define Module_Date_CMHG                16 Oct 2002
+#define Module_MinorVersion_CMHG        4.79.2.50
+#define Module_Date_CMHG                28 Oct 2002
 
 #define Module_MajorVersion             "5.35"
 #define Module_Version                  535
-#define Module_MinorVersion             "4.79.2.49"
-#define Module_Date                     "16 Oct 2002"
+#define Module_MinorVersion             "4.79.2.50"
+#define Module_Date                     "28 Oct 2002"
 
-#define Module_ApplicationDate          "16-Oct-02"
+#define Module_ApplicationDate          "28-Oct-02"
 
 #define Module_ComponentName            "Kernel"
 #define Module_ComponentPath            "RiscOS/Sources/Kernel"
 
-#define Module_FullVersion              "5.35 (4.79.2.49)"
-#define Module_HelpVersion              "5.35 (16 Oct 2002) 4.79.2.49"
+#define Module_FullVersion              "5.35 (4.79.2.50)"
+#define Module_HelpVersion              "5.35 (28 Oct 2002) 4.79.2.50"
 #define Module_LibraryVersionInfo       "5:35"
diff --git a/hdr/Copro15ops b/hdr/Copro15ops
index cf1e7b90b47ac2ae6d7186a47207da39e717e29f..d6c23652aa2ee33ffc01feba81a59bfcf48d6a53 100644
--- a/hdr/Copro15ops
+++ b/hdr/Copro15ops
@@ -98,18 +98,30 @@ C15 CN 15
         MCR$cond ARM_config_cp,0,$reg,ARM_control_reg,C0,0
         MEND
 
-;read MMU fault status
+;read MMU/external fault status
         MACRO
         ARM_read_FSR $reg,$cond
         MRC$cond ARM_config_cp,0,$reg,ARM_FSR_reg,C0,0
         MEND
 
-;read MMU fault address
+;set MMU/external fault status
+        MACRO
+        ARM_write_FSR $reg,$cond
+        MCR$cond ARM_config_cp,0,$reg,ARM_FSR_reg,C0,0
+        MEND
+
+;read MMU/external fault address
         MACRO
         ARM_read_FAR $reg,$cond
         MRC$cond ARM_config_cp,0,$reg,ARM_FAR_reg,C0,0
         MEND
 
+; set MMU/external fault address
+        MACRO
+        ARM_write_FAR $reg,$cond
+        MCR$cond ARM_config_cp,0,$reg,ARM_FAR_reg,C0,0
+        MEND
+
 ;read ID register to register $id
 ;bits 15:12 of returned ID will be 0,7,8,10 for ARM 6,7,8,A
         MACRO
diff --git a/s/AMBControl/memmap b/s/AMBControl/memmap
index 2fc370b2a3a157255fa67df0832c3d445c1bc887..ec7ef5845cc0c836e6bb30dcff5946ffd7469655 100644
--- a/s/AMBControl/memmap
+++ b/s/AMBControl/memmap
@@ -56,7 +56,10 @@
 ;
 ; entry: r0 = aborting address (data address for data abort, instruction address
 ;        for prefetch abort), r1-r7 trashable, no stack
+;        r1 = 1 for prefetch abort, 0 for data abort
+;        FSR valid for data aborts, unpredictable for prefetch aborts
 ; exit:  r0 = non-zero (NE status) if abort was expected and fixed up, zero (EQ status) if not
+;        FAR,FSR,SPSR_abt,lr_abt preserved
 ;
 AMB_LazyFixUp ROUT
         MOV     r7,r12
@@ -64,13 +67,18 @@ AMB_LazyFixUp ROUT
         LDR     r12,[r12]
         CMP     r12,#0
         BEQ     %FT90                                    ;not initialised!
-        LDR     r1,AMBFlags
-        TST     r1,#AMBFlag_LazyMapIn_disable :OR: AMBFlag_LazyMapIn_suspend
+        LDR     r2,AMBFlags
+        TST     r2,#AMBFlag_LazyMapIn_disable :OR: AMBFlag_LazyMapIn_suspend
         BNE     %FT90                                    ;not active
-        LDR     r1,AMBMappedInNode
-        CMP     r1,#0
+        LDR     r2,AMBMappedInNode
+        CMP     r2,#0
         BEQ     %FT90                                    ;no current node
-        LDR     r2,[r1,#AMBNode_Npages]
+        ARM_read_FSR r6                                  ;hang onto FSR in case we have to preserve it
+        TEQ     r1,#1                                    ;if data abort
+        ANDNE   r3,r6,#&F
+        TEQNE   r3,#7                                    ; and not a page translation fault
+        BNE     %FT20                                    ; then not a lazy abort (and FAR may be invalid anyway)
+        LDR     r2,[r2,#AMBNode_Npages]
         SUBS    r0,r0,#ApplicationStart
         BMI     %FT20                                    ;abort not in current app space
         MOV     r0,r0,LSR #Log2PageSize                  ;address now in terms of pages from ApplicationStart
@@ -132,6 +140,8 @@ AMB_LazyFixUp ROUT
         BEQ     %FT90
         MRS     r0,SPSR                                  ;preserve SPSR_abort for original abort details
         MOV     r4,lr                                    ;preserve lr_abort so we can return properly (!)
+        ARM_read_FAR r5                                  ;preserve FAR in case client abort handler wants to read it
+                                                         ;preserve FSR (already in r6) similarly
 30
         LDR     r3,[r1]                                  ;bring that page in by the magic of aborts
         SUBS    r2,r2,#1
@@ -139,6 +149,8 @@ AMB_LazyFixUp ROUT
         BNE     %BT30
         MSR     SPSR_cxsf,r0                             ;SPSR for original abort
         MOV     lr,r4                                    ;restore return address
+        ARM_write_FAR r5                                 ;restore FAR
+        ARM_write_FSR r6                                 ;restore FSR
 ;
 90
         MOVS    r0,#0
diff --git a/s/ARM600 b/s/ARM600
index 7a265070ae2e993f9be665140b2911921b780e7e..11f88286c6889920f46bc24ad2657f5407fe39ea 100644
--- a/s/ARM600
+++ b/s/ARM600
@@ -2458,6 +2458,7 @@ UndPreVeneer    ROUT
 PAbPreVeneer    ROUT
         Push    "r0-r7, lr"               ; wahey, we have an abort stack
         SUB     r0, lr_abort, #4          ; aborting address
+        MOV     r1,#1
         BL      AMB_LazyFixUp             ; can trash r0-r7, returns NE status if claimed and fixed up
         Pull    "r0-r7, lr", NE           ; restore regs and
         SUBNES  pc, lr_abort, #4          ; restart aborting instruction if fixed up
@@ -2524,17 +2525,13 @@ DAbPreVeneer    ROUT
         STR     lr_abort, [r13_abort, #15*4]    ; save old PC, ie instruction address
 
   [ ChocolateAMB
-        ARM_read_FSR r0
-        AND     r0, r0, #&F
-        TEQ     r0, #7
-        BNE     DAb_NotTranslationFault
         ARM_read_FAR r0                         ; aborting address
+        MOV     r1,#0
         BL      AMB_LazyFixUp                   ; can trash r0-r7, returns NE status if claimed and fixed up
         LDR     lr_abort, [r13_abort, #15*4]    ; restore lr_abort
         LDMIA   r13_abort, {r0-r7}              ; restore regs
         ADDNE   r13_abort, r13_abort, #17*4     ; if fixed up, restore r13_abort
         SUBNES  pc, lr_abort, #8                ; and restart aborting instruction
-DAb_NotTranslationFault
   ]
 
         MRS     r0, SPSR                        ; r0 = PSR when we aborted