diff --git a/docs/source/release/v3.12.0/spectroscopy.rst b/docs/source/release/v3.12.0/spectroscopy.rst
index bf7f6d55d0654e5150a36e3b014c8ad81f78ba74..832f5566a2c7937a588ee46adf1b540ebae8ca0b 100644
--- a/docs/source/release/v3.12.0/spectroscopy.rst
+++ b/docs/source/release/v3.12.0/spectroscopy.rst
@@ -12,6 +12,8 @@ Spectroscopy Changes
 Direct Geometry
 ---------------
 
+- TOFTOF data reduction GUI has been improved. In the new version it has options to delete intermediate workspaces, to replace NaNs in S(Q,W), to create diffractograms and to save the reduced data in NXSPE and NeXus format.
+
 Indirect Geometry
 -----------------
 
diff --git a/scripts/Interface/reduction_gui/reduction/toftof/toftof_reduction.py b/scripts/Interface/reduction_gui/reduction/toftof/toftof_reduction.py
index 1e2a0bb268d0e29468242c8e03973024ffef75a1..6aef6cde50c35bdaef87299c2543ba9dbfa0baf2 100644
--- a/scripts/Interface/reduction_gui/reduction/toftof/toftof_reduction.py
+++ b/scripts/Interface/reduction_gui/reduction/toftof/toftof_reduction.py
@@ -340,9 +340,9 @@ class TOFTOFScriptElement(BaseScriptElement):
         self.l("for ws in {}:".format(wsgroup))
         self.l("    name = ws.getComment() + {}".format(suffix))
         if self.saveNXSPE and self.binEon:
-            self.l("    SaveNXSPE(ws, join('{}', name + '.nxspe'), Efixed=Ei)".format(self.saveDir))
+            self.l("    SaveNXSPE(ws, join(r'{}', name + '.nxspe'), Efixed=Ei)".format(self.saveDir))
         if self.saveNexus:
-            self.l("    SaveNexus(ws, join('{}', name + '.nxs'))".format(self.saveDir))
+            self.l("    SaveNexus(ws, join(r'{}', name + '.nxs'))".format(self.saveDir))
         self.l()
 
     def normalize_data(self, gPrefix, gDataRuns, wsEC='', wsVan=''):
@@ -393,7 +393,10 @@ class TOFTOFScriptElement(BaseScriptElement):
         if self.CORR_TOF_VAN == self.correctTof:
             self.l("# apply vanadium TOF correction")
             self.l("{} = CorrectTOF({}, {})".format(gData2, gDataCleanFrame, eppTable))
-            self.delete_workspaces([gDataCleanFrame, gData, eppTable])
+            if self.ecRuns:
+                self.delete_workspaces([gDataCleanFrame, gData, eppTable])
+                return True
+            self.delete_workspaces([gDataCleanFrame, eppTable])
             return True
 
         elif self.CORR_TOF_SAMPLE == self.correctTof:
@@ -401,12 +404,17 @@ class TOFTOFScriptElement(BaseScriptElement):
             self.l("# apply sample TOF correction")
             self.l("{} = FindEPP({})".format(eppTables, gData))
             self.l("{} = CorrectTOF({}, {})".format(gData2, gDataCleanFrame, eppTables))
-            self.delete_workspaces([gDataCleanFrame, gData, eppTables])
+            if self.ecRuns:
+                self.delete_workspaces([gDataCleanFrame, gData, eppTables])
+                return True
+            self.delete_workspaces([gDataCleanFrame, eppTables])
             return True
 
-        if self.vanRuns:
+        if self.vanRuns and self.ecRuns:
             self.delete_workspaces([eppTable, gData])
-        else:
+        elif self.vanRuns:
+            self.delete_workspaces([eppTable])
+        elif self.ecRuns:
             self.delete_workspaces([gData])
         return False
 
@@ -522,8 +530,15 @@ class TOFTOFScriptElement(BaseScriptElement):
         if self.ecRuns:
             wsECNorm2 = wsECNorm + '2'
             self.l("{} = CloneWorkspace({})".format(wsECNorm2, wsECNorm))
+
         if self.vanRuns:
-            wsVanNorm = wsVanSubEC if self.subtractECVan else wsVanNorm
+            if self.subtractECVan:
+                wsVanNorm = wsVanSubEC
+            else:
+                wsVanNorm2 = wsVanNorm + '2'
+                self.l("{} = CloneWorkspace({})".format(wsVanNorm2, wsVanNorm))
+                wsVanNorm = wsVanNorm2
+
             if self.ecRuns:
                 self.l("{} = GroupWorkspaces({}list({}.getNames()))"
                        .format(gData, self.group_list([wsVanNorm, wsECNorm2], ' + '), gDataSource))
@@ -583,7 +598,7 @@ class TOFTOFScriptElement(BaseScriptElement):
             self.l("for ws in {}:" .format(gLast))
             self.l("    step1 = RemoveMaskedSpectra(ws)")
             self.l("    step2 = IntegrateByComponent(step1)")
-            self.l("    step3 = ConvertSpectrumAxis(step2, Target='Theta', EMode='Direct', EFixed=Ei, OrderAxis=True)")
+            self.l("    step3 = ConvertSpectrumAxis(step2, Target='Theta', EMode='Direct', EFixed=Ei)")
             self.l("    Transpose(step3, OutputWorkspace='{}_D_' + ws.getComment())"
                    .format(self.prefix))
             self.l("{} = GroupWorkspaces(['{}_D_'+ ws.getComment() for ws in {}])"
diff --git a/scripts/Interface/reduction_gui/widgets/toftof/toftof_setup.py b/scripts/Interface/reduction_gui/widgets/toftof/toftof_setup.py
index 7f01f75769faa41a2fff2ce263560fac516e5d01..8973e7559e9e5c1cf097fd3a97b2581bd0855da7 100644
--- a/scripts/Interface/reduction_gui/widgets/toftof/toftof_setup.py
+++ b/scripts/Interface/reduction_gui/widgets/toftof/toftof_setup.py
@@ -188,6 +188,14 @@ class TOFTOFSetupWidget(BaseWidget):
     TIP_rbtCorrectTOFVan = ''
     TIP_rbtCorrectTOFSample = ''
 
+    def dir_browse_dialog(self, default_dir=''):
+        """
+            Pop up a directory dialog box.
+        """
+        dirname = str(QFileDialog.getExistingDirectory(self, "Select Directory", default_dir, QFileDialog.DontUseNativeDialog))
+
+        return dirname
+
     def __init__(self, settings):
         BaseWidget.__init__(self, settings = settings)
 
@@ -396,12 +404,12 @@ class TOFTOFSetupWidget(BaseWidget):
         self.runDataModel.selectCell.connect(self._onSelectedCell)
 
     def _onDataDir(self):
-        dirname = self.dir_browse_dialog()
+        dirname = self.dir_browse_dialog(self.dataDir.text())
         if dirname:
             self.dataDir.setText(dirname)
 
     def _onSaveDir(self):
-        dirname = self.dir_browse_dialog()
+        dirname = self.dir_browse_dialog(self.saveDir.text())
         if dirname:
             self.saveDir.setText(dirname)