diff --git a/s/ChangeDyn b/s/ChangeDyn
index 75222baa8f53147d5c77faa7b32953777130bbd4..c089389cec235ef5c4cce83e7ff85d673e94c2d9 100644
--- a/s/ChangeDyn
+++ b/s/ChangeDyn
@@ -104,8 +104,8 @@ DAHandler_PreGrow       *       0
 DAHandler_PostGrow      *       1
 DAHandler_PreShrink     *       2
 DAHandler_PostShrink    *       3
- [ STB
-DAHandler_TestShrink	*	4	; new reason added to find amount area could shrink by
+ [ ShrinkableDAs
+DAHandler_TestShrink    *       4       ; new reason added to find amount area could shrink by
  ]
 
 ; Number of entries in page block on stack
@@ -1711,7 +1711,7 @@ DAReason_Remove *       1
 DAReason_GetInfo *      2
 DAReason_Enumerate *    3
 DAReason_Renumber *     4
- [ STB
+ [ ShrinkableDAs
 DAReason_ReturnFree *   5
 DAReason_Limit  *       6
  |
@@ -1732,8 +1732,8 @@ DynAreaFlags_NotUserDraggable * 1 :SHL: 7
 DynAreaFlags_NeedsSpecificPages *  1 :SHL: 8    ; whether area will ever require particular physical pages
  ]
  ; amg: renaissance... this is a mess!
- [ STB
-DynAreaFlags_Shrinkable	*	1 :SHL: 9	; whether area should be shrunk when need more space in free pool
+ [ ShrinkableDAs
+DynAreaFlags_Shrinkable *       1 :SHL: 9       ; whether area should be shrunk when need more space in free pool
 DynAreaFlags_AccessMask *       DynAreaFlags_APBits :OR: DynAreaFlags_NotBufferable :OR: DynAreaFlags_NotCacheable :OR: DynAreaFlags_DoublyMapped
 
 ; The following bits are only present in page flags
@@ -1774,8 +1774,8 @@ DynAreaSub
         B       DynArea_GetInfo
         B       DynArea_Enumerate
         B       DynArea_Renumber
- [ STB
-	B	DynArea_ReturnFree
+ [ ShrinkableDAs
+        B       DynArea_ReturnFree
  ]
 
 ; unknown OS_DynamicArea reason code
@@ -2175,45 +2175,45 @@ DynArea_Renumber ALTENTRY
         SETV
         EXIT
 
- [ STB
+ [ ShrinkableDAs
 ;**************************************************************************
 ;
-;	DynArea_ReturnFree - Return total free space, including shrinkables
+;       DynArea_ReturnFree - Return total free space, including shrinkables
 ;
-;	Internal routine called by DynamicAreaSWI
+;       Internal routine called by DynamicAreaSWI
 ;
-; in:	r0 = reason code (5)
-;	r1 = area number to exclude, or -1 to include all shrinkable areas
+; in:   r0 = reason code (5)
+;       r1 = area number to exclude, or -1 to include all shrinkable areas
 ;
-; out:	r2 = total amount of free memory
+; out:  r2 = total amount of free memory
 ;
 
 DynArea_ReturnFree ALTENTRY
-	CMP	r1, #-1				; if no excluded area,
-	MOVEQ	r10, r1				; then point r10 nowhere
-	BEQ	%FT10
+        CMP     r1, #-1                         ; if no excluded area,
+        MOVEQ   r10, r1                         ; then point r10 nowhere
+        BEQ     %FT10
 
-	BL	CheckAreaNumber			; else check area number is valid
-	BCC	UnknownDyn			; [unknown area]
+        BL      CheckAreaNumber                 ; else check area number is valid
+        BCC     UnknownDyn                      ; [unknown area]
 10
-	MOV	r11, #DAList
-	MOV	r2, #0
-	LDR	r2, [r2, #FreePoolDANode + DANode_Size] ; start with current size of free pool
+        MOV     r11, #DAList
+        MOV     r2, #0
+        LDR     r2, [r2, #FreePoolDANode + DANode_Size] ; start with current size of free pool
 20
-	LDR	r11, [r11, #DANode_Link]	; load next area
-	TEQ	r11, #0				; if end of list
-	EXIT	EQ				; then exit, with r2 = correct value
+        LDR     r11, [r11, #DANode_Link]        ; load next area
+        TEQ     r11, #0                         ; if end of list
+        EXIT    EQ                              ; then exit, with r2 = correct value
 
-	LDR	lr, [r11, #DANode_Flags]	; load area flags
-	TST	lr, #DynAreaFlags_Shrinkable	; must be shrinkable
-	TEQNE	r11, r10			; and not excluded area
-	BEQ	%BT20				; [don't try this one]
+        LDR     lr, [r11, #DANode_Flags]        ; load area flags
+        TST     lr, #DynAreaFlags_Shrinkable    ; must be shrinkable
+        TEQNE   r11, r10                        ; and not excluded area
+        BEQ     %BT20                           ; [don't try this one]
 
         Push    r3
-	BL	CallTestShrink
-	ADD	r2, r2, r3			; add on amount if any
-	Pull    r3
-	B	%BT20				; then go back for more
+        BL      CallTestShrink
+        ADD     r2, r2, r3                      ; add on amount if any
+        Pull    r3
+        B       %BT20                           ; then go back for more
  ]
 
 ;**************************************************************************
@@ -2680,7 +2680,7 @@ InitDynamicAreas ENTRY "r0-r8,r11"
 
         EXIT
 
-	LTORG
+        LTORG
 
 InitFreePoolTable
         &       0                               ; link: no more nodes on list
@@ -2805,20 +2805,20 @@ AreaShrink
         LDMIA   r2, {r2, r3}
         SUB     lr, r3, r2                      ; lr = amount dest could grow
 
- [ STB
-	CMP	r1, lr
-	MOVHI	r1, lr				; r1 = the most we want to move if we could
-	BLHI	GenNotAllMovedError		; but if not all we still want error
+ [ ShrinkableDAs
+        CMP     r1, lr
+        MOVHI   r1, lr                          ; r1 = the most we want to move if we could
+        BLHI    GenNotAllMovedError             ; but if not all we still want error
         SUB     lr, r5, #1                      ; lr = pagesize mask
         BICS    r1, r1, lr                      ; a pagesize multiple
         BEQ     IssueServiceMemoryMoved
  ]
 
- [ STB
+ [ ShrinkableDAs
         LDR     r2, [r11, #DANode_Size]         ; amount src could shrink
-	CMP	r2, r1
-	BLCC	TryToShrinkShrinkables
-	BCS	%FT15				; [we can now do it all]
+        CMP     r2, r1
+        BLCC    TryToShrinkShrinkables
+        BCS     %FT15                           ; [we can now do it all]
 
 ; we can't move all that is required, so move smaller amount
 
@@ -2991,19 +2991,19 @@ AreaGrow
 
 62
 
- [ STB
+ [ ShrinkableDAs
 ; growing another area from free pool
 ; insert code here to check for shrinking shrinkable areas
 
-	CMP	r1, lr				; if dest can't grow by this amount,
-	BHI	%FT64				; we're definitely not doing anything
+        CMP     r1, lr                          ; if dest can't grow by this amount,
+        BHI     %FT64                           ; we're definitely not doing anything
 
-	CMP	r2, r1				; this should definitely set C=0 as required by TryToShrinkShrinkables
-	Push	"lr"
-	BLCC	TryToShrinkShrinkables
-	Pull	"lr"
-	MOVCS	r3, r1				; if succeeded set r3 to number of bytes to do
-	BCS	%FT65				; and do it
+        CMP     r2, r1                          ; this should definitely set C=0 as required by TryToShrinkShrinkables
+        Push    "lr"
+        BLCC    TryToShrinkShrinkables
+        Pull    "lr"
+        MOVCS   r3, r1                          ; if succeeded set r3 to number of bytes to do
+        BCS     %FT65                           ; and do it
 64
 
 ; end of inserted code
@@ -3170,25 +3170,25 @@ IssueServiceMemoryMoved
         Pull    "r0, r2-r9, r10, lr"
         ExitSWIHandler
 
- [ STB
+ [ ShrinkableDAs
 ; ***********************************************************************************
 ;
-;	TryToShrinkShrinkables - Attempt to make more space by shrinking shrinkable areas if appropriate
+;       TryToShrinkShrinkables - Attempt to make more space by shrinking shrinkable areas if appropriate
 ;
-; in:	r1 = total amount we wish to have in src area (already limited by max_size of destination area)
-;	r2 = current size of src area
-;	r11 -> src area node (we don't do anything unless this is the free pool)
-;	r12 -> dst area node
-;	C = 0
+; in:   r1 = total amount we wish to have in src area (already limited by max_size of destination area)
+;       r2 = current size of src area
+;       r11 -> src area node (we don't do anything unless this is the free pool)
+;       r12 -> dst area node
+;       C = 0
 ;
-; out:	r2 = new size of src area
-;	C=0 => failed to move as much as we wanted
-;	C=1 => succeeded in moving as much as we wanted
+; out:  r2 = new size of src area
+;       C=0 => failed to move as much as we wanted
+;       C=1 => succeeded in moving as much as we wanted
 
 TryToShrinkShrinkables Entry "r0,r1,r10"
-	LDR	lr, [r11, #DANode_Number]
-	TEQ	lr, #ChangeDyn_FreePool
-	EXITS	NE				; if src <> free pool, exit with flags intact
+        LDR     lr, [r11, #DANode_Number]
+        TEQ     lr, #ChangeDyn_FreePool
+        EXITS   NE                              ; if src <> free pool, exit with flags intact
 
         MOV     r10, #DAList
         ASSERT  DANode_Link = 0                 ; because DAList has only link
@@ -3196,27 +3196,27 @@ TryToShrinkShrinkables Entry "r0,r1,r10"
         LDR     r10, [r10, #DANode_Link]        ; and load next
         CMP     r10, #1                         ; any more nodes?
         EXIT    CC                              ; no, then no match
-	TEQ	r10, r12			; check area <> dest
-	LDRNE	lr, [r10, #DANode_Flags]	; and area is shrinkable
-	TSTNE	lr, #DynAreaFlags_Shrinkable
-	BEQ	%BT10				; if not, try next area
-
-	SUBS	r1, r1, r2			; r1 = amount we still need
-	LDR	lr, [r10, #DANode_Size]		; available size of this area
-	CMP	lr, r1
-	MOVCC	r1, lr				; min(amount we need, size of this area)
-	RSB	r1, r1, #0			; make negative - it's a shrink
-	MOV	r0, #0
-	STR	r0, [r0, #CDASemaphore]		; momentarily pretend we're not threaded
-	LDR	r0, [r10, #DANode_Number]
-	SWI	XOS_ChangeDynamicArea
-	MOV	r0, #1
-	STR	r0, [r0, #CDASemaphore-1]	; we're threaded again
-	LDR	r1, [sp, #4]			; reload original r1
-	LDR	r2, [r11, #DANode_Size]		; get new size of src area
-	CMP	r2, r1
-	BCC	%BT10				; if still too small, loop
-	EXIT					; exit CS indicating success
+        TEQ     r10, r12                        ; check area <> dest
+        LDRNE   lr, [r10, #DANode_Flags]        ; and area is shrinkable
+        TSTNE   lr, #DynAreaFlags_Shrinkable
+        BEQ     %BT10                           ; if not, try next area
+
+        SUBS    r1, r1, r2                      ; r1 = amount we still need
+        LDR     lr, [r10, #DANode_Size]         ; available size of this area
+        CMP     lr, r1
+        MOVCC   r1, lr                          ; min(amount we need, size of this area)
+        RSB     r1, r1, #0                      ; make negative - it's a shrink
+        MOV     r0, #0
+        STR     r0, [r0, #CDASemaphore]         ; momentarily pretend we're not threaded
+        LDR     r0, [r10, #DANode_Number]
+        SWI     XOS_ChangeDynamicArea
+        MOV     r0, #1
+        STR     r0, [r0, #CDASemaphore-1]       ; we're threaded again
+        LDR     r1, [sp, #4]                    ; reload original r1
+        LDR     r2, [r11, #DANode_Size]         ; get new size of src area
+        CMP     r2, r1
+        BCC     %BT10                           ; if still too small, loop
+        EXIT                                    ; exit CS indicating success
  ]
 
 ; ***********************************************************************************
@@ -3954,7 +3954,7 @@ CallPostGrow ENTRY "r0,r3,r4, r12"
         LDMIA   r12, {r12, pc}                          ; load workspace pointer and jump to handler
         EXIT
 
- [ STB
+ [ ShrinkableDAs
 ; ***********************************************************************************
 ;
 ;       CallTestShrink - Call test-shrink routine
@@ -3972,8 +3972,8 @@ CallTestShrink ENTRY "r0,r4,r5, r12"
 
         MOV     r0, #DAHandler_TestShrink               ; r0 = reason code
         LDR     r4, [r11, #DANode_Size]                 ; r4 = current size
-	MOV	r5, #0
-	LDR	r5, [r5, #Page_Size]			; set r5 = page size
+        MOV     r5, #0
+        LDR     r5, [r5, #Page_Size]                    ; set r5 = page size
         ASSERT  DANode_Handler = DANode_Workspace +4
         ADD     r12, r11, #DANode_Workspace
         MOV     lr, pc
@@ -3991,7 +3991,7 @@ CallTestShrink ENTRY "r0,r4,r5, r12"
         BLEQ    TranslateError
  ]
         STR     r0, [sp]
-	MOV	r3, #0					; indicate no shrink possible
+        MOV     r3, #0                                  ; indicate no shrink possible
         SETV
         EXIT
  ]
diff --git a/s/GetAll b/s/GetAll
index b5a299633a867f9271b59b37f5dfc9c5e5860284..42c863bba1a700b50d53affbd5c2f2c836e604d9 100644
--- a/s/GetAll
+++ b/s/GetAll
@@ -199,7 +199,7 @@ DoingVdu        SETL    {FALSE}         ; so can get KeyWS!
 Module          SETL    {FALSE}
 
                 GBLL    IncludeTestSrc  ; whether test code is included
-		! 0, "Modified code"
+                ! 0, "Modified code"
  [ MorrisSupport
 IncludeTestSrc  SETL    {FALSE}
  |
@@ -239,18 +239,18 @@ RISCPCBurstMode SETL    {FALSE}
 
   ] ; :LNOT:RO371Timings
 
-		GBLL	DoInitialiseMode
-DoInitialiseMode SETL	{TRUE} :LAND: STB
+                GBLL    DoInitialiseMode
+DoInitialiseMode SETL   {TRUE} :LAND: STB
 
  [ STB
-                GBLL	Select16BitSound	; STBs and pre-IOMD systems don't have this link
-Select16BitSound SETL	{FALSE}
+                GBLL    Select16BitSound        ; STBs and pre-IOMD systems don't have this link
+Select16BitSound SETL   {FALSE}
  |
                 GBLL    Select16BitSound
 Select16BitSound SETL   {TRUE}
  ]
-                GBLL	Japanese16BitSound
-Japanese16BitSound SETL	{TRUE} :LAND: STB
+                GBLL    Japanese16BitSound
+Japanese16BitSound SETL {TRUE} :LAND: STB
 
                 GBLL    Simulator               ; running on simulator?
 Simulator       SETL    {FALSE}
@@ -321,6 +321,8 @@ IgnoreVRAM      SETL    {FALSE}
                 GBLL    LateAborts              ; if true, use late abort mode on ARM600 (compulsory on ARM700)
 LateAborts      SETL    MEMM_Type = "ARM600" :LAND: {TRUE}
 
+                GBLL    ShrinkableDAs           ; if true, support Shrinkable Dynamic Areas (eg. CacheFS)
+ShrinkableDAs   SETL    {TRUE}
 
                 GBLL    StrongARM
                 GBLL    SAWBbroken              ;whether StrongARM Write Buffer is broken (pass 1 silicon only)
@@ -425,14 +427,14 @@ LCDSupport      SETL    {TRUE} :LAND: :LNOT: STB
                 GBLL    FixR9CorruptionInExtensionSWI   ; whether R9 corruption by ExtensionSWI handler is fixed
 FixR9CorruptionInExtensionSWI   SETL    {FALSE}         ; currently FALSE as CC's !SpellMod (possibly others) rely on it being broken
 
-	        GBLL	InterlacedPointer
-InterlacedPointer SETL {TRUE} :LAND: STB		; enable code to do proper interlaced pointer
+                GBLL    InterlacedPointer
+InterlacedPointer SETL {TRUE} :LAND: STB                ; enable code to do proper interlaced pointer
 
-		GBLL	ValidateCMOS		; Apply special CMOS-corruption detection code, and do minimal default settings.
-ValidateCMOS	SETL	{TRUE} :LAND: STB
+                GBLL    ValidateCMOS            ; Apply special CMOS-corruption detection code, and do minimal default settings.
+ValidateCMOS    SETL    {TRUE} :LAND: STB
 
-		GBLL	UseHClk
-UseHClk		SETL	{TRUE} :LAND: STB	; Use HClk when driving TVs.
+                GBLL    UseHClk
+UseHClk         SETL    {TRUE} :LAND: STB       ; Use HClk when driving TVs.
 
               [ DebugHeaps
                 ! 0, "*** WARNING *** Heap debugging assembled in"