diff --git a/Doc/SA_Changes b/Doc/SA_Changes
new file mode 100644
index 0000000000000000000000000000000000000000..3f2ac3143e53b899dbe386b7b787946d2eff7f39
--- /dev/null
+++ b/Doc/SA_Changes
@@ -0,0 +1,12 @@
+StrongARM changes to be made
+============================
+Sources.PutScaled, around line 415ish, flush the caches before
+entering the newly generated code. Alternatively, do it in the
+find_or_compile C routine - that way the memory space taken up
+by the generated code is more cleanly known, making an IMBRange
+SWI easier to implant.
+
+Sources.SprTrans around physical line 2287 (label trns_compiling_complete)
+flush the caches after generating the transformation code. AFAICT,
+this is a simple compilation into a memory block, rather than using
+a set of buffers like the PutScaled routine.
\ No newline at end of file
diff --git a/Sources/swiv2_old b/Sources/swiv2_old
new file mode 100644
index 0000000000000000000000000000000000000000..da379d85bfd67629bb1bf491071503ac772a77a6
--- /dev/null
+++ b/Sources/swiv2_old
@@ -0,0 +1,139 @@
+; Copyright 1996 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.
+;
+
+                AREA    |C$$code|, CODE, READONLY
+
+        EXPORT  |_swix|
+        EXPORT  |_swi|
+|_swi|
+
+; Construct a stack frame that looks something like this:
+;       LDMIA   r12!, {r0..rn}      ; Or NOP if no input regs
+;       ADD     Rb, R12, #Nout * 4  ; Or NOP if no parameter block
+;       SWI     xxxxxx
+;       MOV     R0, Rn              ; Use ADD because Rn is correct bitfield
+;       B       SWIReturn
+;       saved r4-r11,lr
+;       saved r1
+;       saved input values (r2...rn)
+
+        STMFD   sp!, {r2-r3}            ; Save r1 and put 1st two variadic args on stack
+        STMDB   sp!, {r1, r4-r9, lr}
+        ADR     r6, SWIReturn-4
+        B       swix0
+|_swix|
+        ORR     r0, r0, #&20000
+        STMDB   sp!, {r2-r3}
+        STMDB   sp!, {r1, r4-r9, lr}
+        ADR     r6, SWIXReturn-4
+swix0
+        ORR     r3, r0, #&ef000000      ; Construct SWI instruction
+        MOV     r0, r1, LSL #22         ; Construct LDMIA R12!, {regs} instruction
+        MOVS    r0, r0, LSR #22         ; {regs} = {} (IE no input regs) we must not
+        ORRNE   r0, r0, #&e8000000      ; use an LDMIA R12!, {} instruction as this is an
+        ORRNE   r0, r0, #&00bc0000      ; invalid instruction, we use a suitable NOP instead.
+        MOV     r5, r1, LSR #16
+        AND     r5, r5, #&f
+        ORR     r5, r5, #&e1000000
+        ORR     r5, r5, #&a00000
+        ANDS    r2, r1, #&800
+        BLNE    BuildBlockInst
+        SUB     r6, r6, sp
+        MOV     r6, r6, LSR #2
+        BIC     r6, r6, #&ff000000
+        ADD     r6, r6, #&ea000000
+        STMDB   sp!, {r0,r2,r3,r5,r6}
+        ADD     r12, sp, #(5+8)*4       ; Point R12 at input regs on stack.
+  [ StrongARM
+    ;oh my gawd ...
+    ;in case we are running on StrongARM, have to synchronise with respect to modified code
+    ;this is all highly inefficient, and the mechanism needs sorting properly later
+    STMDB  sp!,{r0-r2,lr}           ;don't know whether any of these are trashable
+    MOV    r0,#1                    ;means range specified in r1,r2
+    ADD    r1,sp,#4*4               ;start address (allowing for stacked r0-r2,lr)
+    ADD    r2,r1,#4*4               ;end address (inclusive) for 5 words of code
+    SWI    XOS_SynchroniseCodeAreas ;do the necessary
+    LDMIA  sp!,{r0-r2,lr}
+  ]
+        MOV     pc, sp                  ; Call routine on stack
+SWIReturn
+        STR     pc, [sp, #4*4]!         ; no PC+12/PC+8 problem (old/new ARM) since only condition codes used
+        LDR     lr, [sp, #1*4]
+        MOVS    lr, lr, ASL #1          ; Shift out setting C if R0 to be written, N
+        LDRCS   lr, [r12], #4           ; if R1 to be written.
+        STRCS   r0, [lr]
+        LDRMI   lr, [r12], #4
+        STRMI   r1, [lr]
+        LDR     lr, [sp, #1*4]
+        B       ReturnTail
+SWIXReturn
+        STR     pc, [sp, #4*4]!         ; no PC+12/PC+8 problem (old/new ARM) since only condition codes used
+        LDR     lr, [sp, #1*4]
+        BVS     VSetReturn
+        MOVS    lr, lr, ASL #1          ; Shift out setting C if R0 to be written, N
+        LDRCS   lr, [r12], #4           ; if R1 to be written.
+        STRCS   r0, [lr]
+        LDRMI   lr, [r12], #4
+        STRMI   r1, [lr]
+        LDR     lr, [sp, #1*4]
+        TST     lr, #&f0000
+        MOVEQ   r0, #0
+ReturnTail
+        MOVS    lr, lr, ASL #3          ; Shift 2 bits each time for the next 2 regs
+        LDRCS   r1, [r12], #4
+        STRCS   r2, [r1]
+        LDRMI   r1, [r12], #4
+        STRMI   r3, [r1]
+        AND     lr, lr, #&ff000000
+        MOVS    lr, lr, ASL #2
+        LDRCS   r1, [r12], #4
+        STRCS   r4, [r1]
+        BEQ     VSetReturn              ; Typically saves 16S - (3S + 1N)
+        LDRMI   r1, [r12], #4
+        STRMI   r5, [r1]
+        MOVS    lr, lr, ASL #2
+        LDRCS   r1, [r12], #4
+        STRCS   r6, [r1]
+        LDRMI   r1, [r12], #4
+        STRMI   r7, [r1]
+        MOVS    lr, lr, ASL #2
+        LDRCS   r1, [r12], #4
+        STRCS   r8, [r1]
+        LDRMI   r1, [r12], #4
+        STRMI   r9, [r1]
+        MOVS    lr, lr, ASL #2
+        LDRCS   r9, [sp]
+        LDRCS   r1, [r12], #4
+        STRCS   r9, [r1]
+VSetReturn
+        ADD     sp, sp, #2*4
+        LDMIA   sp!, {r4-r9,lr}
+        ADD     sp, sp, #2 * 4
+        MOVS    pc, lr
+
+BuildBlockInst
+        MOV     r4, #6
+        AND     r2, r1, #&f000
+        ORR     r2, r2, #&e2000000
+        ORR     r2, r2, #&008c0000
+BuildBlockInst1
+        MOVS    r1, r1, ASL #2
+        ADDCS   r2, r2, #4
+        ADDMI   r2, r2, #4
+        SUBS    r4, r4, #1
+        BNE     BuildBlockInst1
+        MOVS    pc, lr
+
+        END