diff --git a/VersionASM b/VersionASM
index ca30bbd11f092c29b889565ff73bc0336ade9a61..1666ce515fff5310fbf0cbe6716fd5235b2de227 100644
--- a/VersionASM
+++ b/VersionASM
@@ -9,12 +9,12 @@
                         GBLS    Module_ApplicationDate
                         GBLS    Module_HelpVersion
                         GBLS    Module_ComponentName
-Module_MajorVersion     SETS    "6.32"
-Module_Version          SETA    632
+Module_MajorVersion     SETS    "6.33"
+Module_Version          SETA    633
 Module_MinorVersion     SETS    ""
-Module_Date             SETS    "19 Jan 2020"
-Module_ApplicationDate  SETS    "19-Jan-20"
+Module_Date             SETS    "12 Feb 2020"
+Module_ApplicationDate  SETS    "12-Feb-20"
 Module_ComponentName    SETS    "Kernel"
-Module_FullVersion      SETS    "6.32"
-Module_HelpVersion      SETS    "6.32 (19 Jan 2020)"
+Module_FullVersion      SETS    "6.33"
+Module_HelpVersion      SETS    "6.33 (12 Feb 2020)"
                         END
diff --git a/VersionNum b/VersionNum
index de1a61d7cd9a07ab0ec330671fb19186ec42ec8c..1f9a95d8e68adc91e49f00a9fb9a4a874f7b366f 100644
--- a/VersionNum
+++ b/VersionNum
@@ -1,21 +1,21 @@
-/* (6.32)
+/* (6.33)
  *
  * This file is automatically maintained by srccommit, do not edit manually.
  *
  */
-#define Module_MajorVersion_CMHG        6.32
+#define Module_MajorVersion_CMHG        6.33
 #define Module_MinorVersion_CMHG        
-#define Module_Date_CMHG                19 Jan 2020
+#define Module_Date_CMHG                12 Feb 2020
 
-#define Module_MajorVersion             "6.32"
-#define Module_Version                  632
+#define Module_MajorVersion             "6.33"
+#define Module_Version                  633
 #define Module_MinorVersion             ""
-#define Module_Date                     "19 Jan 2020"
+#define Module_Date                     "12 Feb 2020"
 
-#define Module_ApplicationDate          "19-Jan-20"
+#define Module_ApplicationDate          "12-Feb-20"
 
 #define Module_ComponentName            "Kernel"
 
-#define Module_FullVersion              "6.32"
-#define Module_HelpVersion              "6.32 (19 Jan 2020)"
-#define Module_LibraryVersionInfo       "6:32"
+#define Module_FullVersion              "6.33"
+#define Module_HelpVersion              "6.33 (12 Feb 2020)"
+#define Module_LibraryVersionInfo       "6:33"
diff --git a/hdr/KernelWS b/hdr/KernelWS
index 1b39fa468aec8f511130abf7713e2c12bc2827a4..9b4647bc6d4e9e532c26cc6d3df2836a97142e41 100644
--- a/hdr/KernelWS
+++ b/hdr/KernelWS
@@ -804,6 +804,7 @@ ScreenBlankDPMSState # 1       ; 0 => just blank video
                                ; 1 => blank to stand-by (hsync off)
                                ; 2 => blank to suspend (vsync off)
                                ; 3 => blank to off (H+V off)
+                               ; 255 => no mode programmed yet
 
         ASSERT  ScreenBlankDPMSState =  Legacy_ScreenBlankDPMSState
         ASSERT ?ScreenBlankDPMSState = ?Legacy_ScreenBlankDPMSState
diff --git a/s/PMF/osbyte b/s/PMF/osbyte
index 5c7606bda02a24ec41a1354687b5a830be298967..a017b476cfac30286401272dc17f27242a775146 100644
--- a/s/PMF/osbyte
+++ b/s/PMF/osbyte
@@ -563,9 +563,11 @@ Osbyte13 ROUT
         TSTNE   R1, #3                  ; NE => blanked and DPMS turned off HSync or VSync
         MyOsbyte NE                     ; if true exit immediately
 
-        ; Also, exit now if we don't have a driver active
+        ; Also, exit now if we don't have a driver active, or there's no
+        ; mode programmed
         LDR     R0, [LR,#CurrentGraphicsVDriver]
         CMP     R0, #GraphicsVInvalid
+        CMPEQ   R1, #255
         MyOsbyte EQ
 
 ; It is actually better to call Idle with interrupts disabled as it stops the interrupt
diff --git a/s/vdu/vdudriver b/s/vdu/vdudriver
index fb0227228bc163a3391f72d7da05b87a5267f769..4f4196c6d2f3265223213d1c3e7bf8ac9c1e7983 100644
--- a/s/vdu/vdudriver
+++ b/s/vdu/vdudriver
@@ -106,9 +106,9 @@ VduInit ROUT
         ASSERT (ZeroPage :AND: 255) = 0
         STRB    R0, [R0, #OsbyteVars + :INDEX: VDUqueueItems] ;purge queue
         STRB    R0, [WsPtr, #ScreenBlankFlag]   ; not blanked
-      [ ZeroPage <> 0
+        MOV     R0, #255
+        STRB    R0, [WsPtr, #ScreenBlankDPMSState] ; however, no mode programmed yet
         MOV     R0, #0
-      ]
         STR     R0, [WsPtr, #CursorCounter]
         STR     R0, [WsPtr, #CursorDesiredState]
         STR     R0, [WsPtr, #VduStatus]
diff --git a/s/vdu/vdupalxx b/s/vdu/vdupalxx
index b31d9a8867a0d6636edc76fc5450b43fe8d462a4..77a104de23ff31f22084e73601006f3ee9cf5725 100644
--- a/s/vdu/vdupalxx
+++ b/s/vdu/vdupalxx
@@ -1064,6 +1064,7 @@ PV_BlankScreen ROUT
         AND     r0, r0, #1
         STRB    r0, [WsPtr, #ScreenBlankFlag]      ; update new state
         LDRB    r1, [WsPtr, #ScreenBlankDPMSState]
+        AND     r1, r1, #3
 
         LDR     r4, [WsPtr, #CurrentGraphicsVDriver]
         MOV     r4, r4, LSL #24
diff --git a/s/vdu/vduswis b/s/vdu/vduswis
index 0f08566d2a97a8b712568616dad83161d1d9e2ea..25b06b42d32ba39359a76bcea238c4dfca764ec1 100644
--- a/s/vdu/vduswis
+++ b/s/vdu/vduswis
@@ -1273,6 +1273,10 @@ RemovePages ROUT
 
 ; display starts in pages that remain
 
+        CMP     R4, #0                  ; if we've somehow shrunk to zero,
+        MOVEQ   R5, R14                 ; then DisplayStart = ScreenEndAddr,
+        BEQ     %FT06                   ; and avoid the infinite loop below!
+
         SUB     R5, R3, R0              ; new DisplayStart
 
 05
@@ -1280,6 +1284,7 @@ RemovePages ROUT
         SUBCS   R5, R5, R4              ; then repeatedly subtract off new size
         BCS     %BT05                   ; until in range
 
+06
         Push    "R0-R2"
         MOV     R0, R5                  ; put new display start in r0
         BL      SetVinit                ; this updates DisplayStart
@@ -1302,10 +1307,15 @@ InsertRemovePagesExit
         LDR     R4, [WsPtr, #DisplayScreenStart]
         SUB     R0, R4, R0
         LDR     R3, [WsPtr, #TotalScreenSize]
+
+        CMP     R3, #0
+        MOVEQ   R0, R14
+        BEQ     %FT26
 25
         CMP     R0, R14                 ; ensure displayscreenstart in range too
         SUBCS   R0, R0, R3
         BCS     %BT25
+26
         BL      NewScreenStart
 30
         BL      SetVendDefault
@@ -2063,6 +2073,10 @@ ScreenMode_SelectDevice ROUT
         MOV     r1, #Service_DisplayChanged
         MOV     r3, #DisplayChangedSub_ModeChanged
         IssueService
+        ; Flag that VSync probably isn't working
+        ; (will be cleared by HardwareModeChange)
+        MOV     r0, #255
+        STRB    r0, [WsPtr, #ScreenBlankDPMSState]
         ; Update current driver VDU var
         STR     r2, [WsPtr, #CurrentGraphicsVDriver]
         ; Issue service call to indicate change is coming
@@ -2071,28 +2085,47 @@ ScreenMode_SelectDevice ROUT
         ; Call InitialiseMode to select a mode to use for this new driver
         CMP     r2, #GraphicsVInvalid
         BLNE    InitialiseMode
-        BVS     %FT15
-        ; Success!
-        MOV     r0, #DisplayChanged_Changed
-        IssueService
-        MOV     r1, r5
-        EXIT
-15
-        ; Something went wrong trying to activate the new driver
-        ; Try and restore the old one
+        BVC     %FT15
+        ; Something went wrong trying to activate the new driver.
+        ; Make sure the VSync flag is still set.
+        MOV     lr, #255
+        STRB    lr, [WsPtr, #ScreenBlankDPMSState]
+        ; Do we have an old driver we can try and switch back to?
+        ;
+        ; If we don't have an old driver, just stick with this new
+        ; one, under the assumption that the failure was because we
+        ; couldn't find a valid mode to switch to (which is generally
+        ; the only way in which InitialiseMode will fail). For such a
+        ; situation, there's a reasonable chance that things will start
+        ; working later on during the boot sequence, e.g. once an MDF
+        ; is loaded. And for such a case, temporarily having a broken
+        ; driver active is much better than restoring the "no driver"
+        ; state, since we currently don't have any kind of watchdog which
+        ; will kick the video system into life once the MDF does get
+        ; loaded.
+        CMP     r5, #GraphicsVInvalid
+        BEQ     %FT15
         STR     r0, [sp] ; Return the error to the caller
         STR     r5, [WsPtr, #CurrentGraphicsVDriver]
         MOV     r0, #DisplayChanged_Changing
         MOV     r2, r5
         IssueService
-        CMP     r5, #GraphicsVInvalid
-        BLNE    InitialiseMode
+        BL      InitialiseMode
+        MOVVS   lr, #255
+        STRVSB  lr, [WsPtr, #ScreenBlankDPMSState]
         ; TODO - Try harder if this 2nd call fails (e.g. try all drivers in turn)
         MOV     r0, #DisplayChanged_Changed
         IssueService
         MOV     r1, r5
         SETV
         EXIT
+
+15
+        ; Success!
+        MOV     r0, #DisplayChanged_Changed
+        IssueService
+        MOV     r1, r5
+        EXIT
 20
         PullEnv
         ADR     r0, ErrorBlock_BadGDriver