diff --git a/qt/applications/workbench/workbench/app/mainwindow.py b/qt/applications/workbench/workbench/app/mainwindow.py
index 430e2de93d635895609108585b2b6a968853c4a0..655cfb5716a5e18f10d7467d7dc973ef7cd13be4 100644
--- a/qt/applications/workbench/workbench/app/mainwindow.py
+++ b/qt/applications/workbench/workbench/app/mainwindow.py
@@ -372,18 +372,24 @@ class MainWindow(QMainWindow):
     def launch_custom_python_gui(self, filename):
         self.interface_executor.execute(open(filename).read(), filename)
 
-    def launch_custom_cpp_gui(self, interface_name):
+    def launch_custom_cpp_gui(self, interface_name, submenu = None):
         """Create a new interface window if one does not already exist,
         else show existing window"""
         object_name = 'custom-cpp-interface-' + interface_name
         window = find_window(object_name, QMainWindow)
         if window is None:
-            interface = self.interface_manager.createSubWindow(interface_name,self)
+            interface = self.interface_manager.createSubWindow(interface_name)
             interface.setObjectName(object_name)
             interface.setAttribute(Qt.WA_DeleteOnClose, True)
+            # make indirect interfaces children of workbench
+            if submenu == "Indirect":
+                interface.setParent(self, interface.windowFlags())
             interface.show()
         else:
-            window.raise_()
+            if (window.windowState() ==  Qt.WindowState.WindowMinimized):
+                window.showNormal()
+            else:
+                window.raise_()
 
     def populate_interfaces_menu(self):
         """Populate then Interfaces menu with all Python and C++ interfaces"""
@@ -404,8 +410,8 @@ class MainWindow(QMainWindow):
                     action.triggered.connect(lambda checked_py, script=script: self.launch_custom_python_gui(script))
                 else:
                     action = submenu.addAction(name)
-                    action.triggered.connect(lambda checked_cpp, name=name:
-                                             self.launch_custom_cpp_gui(name))
+                    action.triggered.connect(lambda checked_cpp, name=name, key=key:
+                                             self.launch_custom_cpp_gui(name, key))
 
     def _discover_python_interfaces(self, interface_dir):
         """Return a dictionary mapping a category to a set of named Python interfaces"""
diff --git a/qt/python/mantidqt/utils/writetosignal.py b/qt/python/mantidqt/utils/writetosignal.py
index 26d39fbf5d02c518804c161a21b2114659c9aebf..2a85db8201fb07bd2bd4e6c77d870ea4144eb510 100644
--- a/qt/python/mantidqt/utils/writetosignal.py
+++ b/qt/python/mantidqt/utils/writetosignal.py
@@ -45,6 +45,11 @@ class WriteToSignal(QObject):
                 self.sig_write_received.emit("Error: Unable to write to the console of the process.\n"
                                              "This error is not related to your script's execution.\n"
                                              "Original error: {}\n\n".format(str(e)))
-
+            except UnicodeEncodeError:
+                """
+                Scripts containing unicode characters could fail to run if mantid is not started from the
+                terminal on unix systems. The script runs fine if this exception is caught and discarded.
+                """
+                pass
         # always write to the message log
         self.sig_write_received.emit(txt)
diff --git a/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py b/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py
index 53695267584133f85f9d2cb872b9054de2728401..46a4e82df002fb8d5729a013fb0242cb87e9f59a 100644
--- a/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py
+++ b/qt/python/mantidqt/widgets/workspacedisplay/matrix/table_view_model.py
@@ -84,27 +84,32 @@ class MatrixWorkspaceTableViewModel(QAbstractTableModel):
             raise ValueError("Unknown model type {0}".format(self.type))
 
     def _makeVerticalHeader(self, section, role):
+        def _numeric_axis_value_unit(axis):
+            # binned/point data
+            if axis.length() == self.ws.getNumberHistograms() + 1:
+                value = 0.5 * (float(axis.label(section)) + float(axis.label(section + 1)))
+            else:
+                value = float(axis.label(section))
+            return value, axis.getUnit().symbol().utf8()
+
         axis_index = 1
         # check that the vertical axis actually exists in the workspace
         if self.ws.axes() > axis_index:
+            axis = self.ws.getAxis(axis_index)
             if role == Qt.DisplayRole:
-                if not self.ws.getAxis(axis_index).isNumeric():
+                if not axis.isNumeric():
                     return self.VERTICAL_HEADER_DISPLAY_STRING.format(
-                        section, self.ws.getAxis(axis_index).label(section))
+                        section, axis.label(section))
                 else:
-                    bin_center = (float(self.ws.getAxis(axis_index).label(section)) +
-                                  float(self.ws.getAxis(axis_index).label(section+1)))/2.0
-                    unit = self.ws.getAxis(axis_index).getUnit().symbol().utf8()
-                    return self.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format(section, bin_center, unit)
+                    display_value, unit = _numeric_axis_value_unit(axis)
+                    return self.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format(section, display_value, unit)
             else:
-                if not self.ws.getAxis(axis_index).isNumeric():
+                if not axis.isNumeric():
                     spectrum_number = self.ws.getSpectrum(section).getSpectrumNo()
                     return self.VERTICAL_HEADER_TOOLTIP_STRING.format(section, spectrum_number)
                 else:
-                    bin_center = (float(self.ws.getAxis(axis_index).label(section)) +
-                                  float(self.ws.getAxis(axis_index).label(section+1)))/2.0
-                    unit = self.ws.getAxis(axis_index).getUnit().symbol().utf8()
-                    return self.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format(section, bin_center, unit)
+                    display_value, unit = _numeric_axis_value_unit(axis)
+                    return self.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format(section, display_value, unit)
         else:
             raise NotImplementedError("What do we do here? Handle if the vertical axis does NOT exist")
 
diff --git a/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py b/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py
index 8c1c8e30706783a3affe9f42b1fc25a0d899b256..59efbbac08ca9dbd514e4ef6c5093924504a1268 100644
--- a/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py
+++ b/qt/python/mantidqt/widgets/workspacedisplay/matrix/test/test_matrixworkspacedisplay_table_view_model.py
@@ -386,13 +386,13 @@ class MatrixWorkspaceDisplayTableViewModelTest(unittest.TestCase):
                                                                                               MockSpectrum.SPECTRUM_NO)
         self.assertEqual(expected_output, output)
 
-    def test_headerData_vertical_header_display_for_numeric_axis(self):
+    def test_headerData_vertical_header_display_for_numeric_axis_with_point_data(self):
         dummy_unit = 'unit'
-        bin_center = 0.5
         ws = MockWorkspace()
         mock_axis = Mock()
         mock_axis.isNumeric.return_value = True
-        mock_axis.label = MagicMock(side_effect=lambda x: x)
+        expected_value = 0.
+        mock_axis.label = MagicMock(side_effect=[str(expected_value)])
         mock_axis.getUnit().symbol().utf8.return_value = dummy_unit
         ws.getAxis.return_value = mock_axis
 
@@ -403,17 +403,63 @@ class MatrixWorkspaceDisplayTableViewModelTest(unittest.TestCase):
 
         expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format(
             mock_section,
-            bin_center,
+            expected_value,
             dummy_unit)
         self.assertEqual(expected_output, output)
 
-    def test_headerData_vertical_header_tooltip_for_numeric_axis(self):
+    def test_headerData_vertical_header_display_for_numeric_axis_with_binned_data(self):
         dummy_unit = 'unit'
-        bin_center = 0.5
         ws = MockWorkspace()
         mock_axis = Mock()
         mock_axis.isNumeric.return_value = True
-        mock_axis.label = MagicMock(side_effect=lambda x: x)
+        # single spectrum with length 2 axis
+        ws.getNumberHistograms.return_value = 1
+        mock_axis.length.return_value = 2
+        mock_axis.label = MagicMock(side_effect=["0", "1"])
+        mock_axis.getUnit().symbol().utf8.return_value = dummy_unit
+        ws.getAxis.return_value = mock_axis
+
+        model_type = MatrixWorkspaceTableViewModelType.y
+        model = MatrixWorkspaceTableViewModel(ws, model_type)
+        mock_section = 0
+        output = model.headerData(mock_section, Qt.Vertical, Qt.DisplayRole)
+
+        expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_DISPLAY_STRING_FOR_NUMERIC_AXIS.format(
+            mock_section,
+            0.5,
+            dummy_unit)
+        self.assertEqual(expected_output, output)
+
+    def test_headerData_vertical_header_tooltip_for_numeric_axis_with_point_data(self):
+        dummy_unit = 'unit'
+        ws = MockWorkspace()
+        mock_axis = Mock()
+        mock_axis.isNumeric.return_value = True
+        ws.getNumberHistograms.return_value = 1
+        mock_axis.length.return_value = 1
+        mock_axis.label = MagicMock(side_effect=["0"])
+        mock_axis.getUnit().symbol().utf8.return_value = dummy_unit
+        ws.getAxis.return_value = mock_axis
+
+        model_type = MatrixWorkspaceTableViewModelType.y
+        model = MatrixWorkspaceTableViewModel(ws, model_type)
+        mock_section = 0
+        output = model.headerData(mock_section, Qt.Vertical, Qt.ToolTipRole)
+
+        expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format(
+            mock_section,
+            0,
+            dummy_unit)
+        self.assertEqual(expected_output, output)
+
+    def test_headerData_vertical_header_tooltip_for_numeric_axis_with_binned_data(self):
+        dummy_unit = 'unit'
+        ws = MockWorkspace()
+        mock_axis = Mock()
+        mock_axis.isNumeric.return_value = True
+        ws.getNumberHistograms.return_value = 1
+        mock_axis.length.return_value = 2
+        mock_axis.label = MagicMock(side_effect=["0", "1"])
         mock_axis.getUnit().symbol().utf8.return_value = dummy_unit
         ws.getAxis.return_value = mock_axis
 
@@ -424,7 +470,7 @@ class MatrixWorkspaceDisplayTableViewModelTest(unittest.TestCase):
 
         expected_output = MatrixWorkspaceTableViewModel.VERTICAL_HEADER_TOOLTIP_STRING_FOR_NUMERIC_AXIS.format(
             mock_section,
-            bin_center,
+            0.5,
             dummy_unit)
         self.assertEqual(expected_output, output)