diff --git a/MantidPlot/src/Mantid/MantidMatrixModel.cpp b/MantidPlot/src/Mantid/MantidMatrixModel.cpp
index d71773369472c3b66f86701c5c049345e6877957..c202b776202cc2d35b3b12bad2793398be670bd4 100644
--- a/MantidPlot/src/Mantid/MantidMatrixModel.cpp
+++ b/MantidPlot/src/Mantid/MantidMatrixModel.cpp
@@ -8,10 +8,15 @@
 #include "MantidAPI/TextAxis.h"
 #include "MantidKernel/ReadLock.h"
 
+#include "MantidQtWidgets/Common/QStringUtils.h"
+
 #include <QApplication>
 #include <QObject>
 #include <QPalette>
 #include <QVariant>
+
+using MantidQt::API::toQStringInternal;
+
 // ----------   MantidMatrixModel   ------------------ //
 
 /**   MantidMatrixModel constructor.
@@ -132,7 +137,7 @@ QVariant MantidMatrixModel::headerData(int section, Qt::Orientation orientation,
       }
     }
 
-    QString unit = QString::fromStdWString(axis->unit()->label().utf8());
+    QString unit = toQStringInternal(axis->unit()->label().utf8());
 
     // Handle RefAxis for X axis
     Mantid::API::RefAxis *refAxis = dynamic_cast<Mantid::API::RefAxis *>(axis);
diff --git a/buildconfig/CMake/MSVCSetup.cmake b/buildconfig/CMake/MSVCSetup.cmake
index c64593fe0f7c556790c08b355c3deaa3538ce24b..e43004a65adeb0c698afe821b82562fbcf71e45c 100644
--- a/buildconfig/CMake/MSVCSetup.cmake
+++ b/buildconfig/CMake/MSVCSetup.cmake
@@ -19,9 +19,7 @@ add_definitions ( -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS )
 ##########################################################################
 # /MP     - Compile .cpp files in parallel
 # /W3     - Warning Level 3 (This is also the default)
-# /Zc:wchar_t- - Do not treat wchar_t as a builtin type. Required for Qt to
-#           work with wstring
-set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /W3 /Zc:wchar_t-" )
+set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /W3" )
 
 # Set PCH heap limit, the default does not work when running msbuild from the commandline for some reason
 # Any other value lower or higher seems to work but not the default. It it is fine without this when compiling
diff --git a/qt/widgets/common/CMakeLists.txt b/qt/widgets/common/CMakeLists.txt
index 32ec0b86f5128e87c6652f7feef8fc1ac53691d8..da0c5c53983b8743abf4314730519131d31ea5b4 100644
--- a/qt/widgets/common/CMakeLists.txt
+++ b/qt/widgets/common/CMakeLists.txt
@@ -266,6 +266,7 @@ set ( INC_FILES
 	inc/MantidQtWidgets/Common/PythonSystemHeader.h
 	inc/MantidQtWidgets/Common/PythonThreading.h
 	inc/MantidQtWidgets/Common/QScienceSpinBox.h
+	inc/MantidQtWidgets/Common/QStringUtils.h
 	inc/MantidQtWidgets/Common/ScriptRepositoryView.h
 	inc/MantidQtWidgets/Common/SelectionNotificationService.h
 	inc/MantidQtWidgets/Common/SignalBlocker.h
diff --git a/qt/widgets/common/inc/MantidQtWidgets/Common/QStringUtils.h b/qt/widgets/common/inc/MantidQtWidgets/Common/QStringUtils.h
new file mode 100644
index 0000000000000000000000000000000000000000..173627c43260e9e301f3b5a62420b3011d6f776b
--- /dev/null
+++ b/qt/widgets/common/inc/MantidQtWidgets/Common/QStringUtils.h
@@ -0,0 +1,41 @@
+#ifndef MANTIDQT_API_QSTRINGUTILS_H
+#define MANTIDQT_API_QSTRINGUTILS_H
+
+#include <QString>
+#include <string>
+
+namespace MantidQt {
+namespace API {
+/**
+* Internal version of QString::fromStdWString. On MSVC Qt4 rquired
+* /Z:wchar_t- but Qt5 does not. For simplicity we
+* remove the /Z:wchar_t- compiler option and
+* define the functionality interally.
+* @param str A pointer to the raw wchar_t string
+*/
+inline QString toQStringInternal(const wchar_t *str) {
+  return sizeof(wchar_t) == sizeof(QChar)
+             ? QString::fromUtf16(reinterpret_cast<const ushort *>(str),
+                                  static_cast<int>(wcslen(str)))
+             : QString::fromUcs4(reinterpret_cast<const uint *>(str),
+                                 static_cast<int>(wcslen(str)));
+}
+
+/**
+* Internal version of QString::fromStdWString. On MSVC Qt4 rquired
+* /Z:wchar_t- but Qt5 does not. For simplicity we
+* remove the /Z:wchar_t- compiler option and
+* define the functionality interally.
+* @param str A std::wstring object
+*/
+inline QString toQStringInternal(const std::wstring &str) {
+  return sizeof(wchar_t) == sizeof(QChar)
+             ? QString::fromUtf16(reinterpret_cast<const ushort *>(str.data()),
+                                  static_cast<int>(str.size()))
+             : QString::fromUcs4(reinterpret_cast<const uint *>(str.data()),
+                                 static_cast<int>(str.size()));
+}
+}
+}
+
+#endif // MANTIDQT_API_QSTRINGUTILS_H
\ No newline at end of file
diff --git a/qt/widgets/common/src/PlotAxis.cpp b/qt/widgets/common/src/PlotAxis.cpp
index b8ab39cc480c8e083cccd85df082a4c8c4520c9d..6dc892f4fb0d25227ab33b7597319f480b8aab5e 100644
--- a/qt/widgets/common/src/PlotAxis.cpp
+++ b/qt/widgets/common/src/PlotAxis.cpp
@@ -1,4 +1,5 @@
 #include "MantidQtWidgets/Common/PlotAxis.h"
+#include "MantidQtWidgets/Common/QStringUtils.h"
 
 #include "MantidAPI/Axis.h"
 #include "MantidAPI/MatrixWorkspace.h"
@@ -72,7 +73,7 @@ void PlotAxis::titleFromDimension(const Mantid::Geometry::IMDDimension &dim) {
   if (!m_title.isEmpty()) {
     auto unitLbl = dim.getUnits();
     if (!unitLbl.utf8().empty()) {
-      m_title += " (" + QString::fromStdWString(unitLbl.utf8()) + ")";
+      m_title += " (" + toQStringInternal(unitLbl.utf8()) + ")";
     } else if (!unitLbl.ascii().empty()) {
       m_title += " (" + QString::fromStdString(unitLbl.ascii()) + ")";
     }
@@ -103,8 +104,8 @@ void PlotAxis::titleFromYData(const Mantid::API::MatrixWorkspace &workspace,
       const auto xunit = workspace.getAxis(0)->unit();
       const auto lbl = xunit->label();
       if (!lbl.utf8().empty()) {
-        m_title += " (" + QString::fromStdWString(lbl.utf8()) + ")" +
-                   QString::fromWCharArray(L"\u207b\u00b9");
+        m_title += " (" + toQStringInternal(lbl.utf8()) + ")" +
+                   toQStringInternal(L"\u207b\u00b9");
       }
     }
   } else {
diff --git a/qt/widgets/common/test/PlotAxisTest.h b/qt/widgets/common/test/PlotAxisTest.h
index aad6ec1684ab892ab00689996597ed4821c9a87b..1c34e83e3a765e1df63fc93a1571c4c2e2ac398a 100644
--- a/qt/widgets/common/test/PlotAxisTest.h
+++ b/qt/widgets/common/test/PlotAxisTest.h
@@ -4,6 +4,7 @@
 #include <cxxtest/TestSuite.h>
 
 #include "MantidQtWidgets/Common/PlotAxis.h"
+#include "MantidQtWidgets/Common/QStringUtils.h"
 #include "MantidAPI/NumericAxis.h"
 #include "MantidAPI/SpectraAxis.h"
 #include "MantidGeometry/MDGeometry/MDHistoDimension.h"
@@ -80,7 +81,8 @@ public:
     ws->getAxis(0)->setUnit("TOF");
     ws->replaceAxis(1, new Mantid::API::NumericAxis(1));
     ws->getAxis(1)->setUnit("TOF");
-    QString expected = QString::fromWCharArray(L"Time-of-flight (\u03bcs)");
+    QString expected =
+        MantidQt::API::toQStringInternal(L"Time-of-flight (\u03bcs)");
     TS_ASSERT_EQUALS(expected, PlotAxis(*ws, 0).title());
     TS_ASSERT_EQUALS(expected, PlotAxis(*ws, 1).title());
   }
@@ -94,8 +96,8 @@ public:
     const auto lbl = xunit->label();
     // the Y unit should be (<x_unit_label>)^-1 when plotting as distribution
     // instead of (<x_unit_label>^-1).
-    TS_ASSERT_EQUALS(" (" + QString::fromStdWString(lbl.utf8()) + ")" +
-                         QString::fromWCharArray(L"\u207b\u00b9"),
+    TS_ASSERT_EQUALS(" (" + MantidQt::API::toQStringInternal(lbl.utf8()) + ")" +
+                         MantidQt::API::toQStringInternal(L"\u207b\u00b9"),
                      PlotAxis(true, *ws).title());
   }
 
@@ -139,7 +141,7 @@ public:
         Mantid::Geometry::GeneralFrame::GeneralFrameTOF,
         UnitLabel("us", L"\u03bcs", "\\mu s"));
     MDHistoDimension dim("tof", "dimx", frame, 0.0f, 1.0f, 10);
-    QString expected = QString::fromWCharArray(L"tof (\u03bcs)");
+    QString expected = MantidQt::API::toQStringInternal(L"tof (\u03bcs)");
     TS_ASSERT_EQUALS(expected, PlotAxis(dim).title());
   }
 
diff --git a/qt/widgets/legacyqwt/src/MantidQwtIMDWorkspaceData.cpp b/qt/widgets/legacyqwt/src/MantidQwtIMDWorkspaceData.cpp
index 0fa0b651f41a6486dae3ce20821070abf447d45c..e6a3d3abaa00e12b61d00828da11b270d60e8184 100644
--- a/qt/widgets/legacyqwt/src/MantidQwtIMDWorkspaceData.cpp
+++ b/qt/widgets/legacyqwt/src/MantidQwtIMDWorkspaceData.cpp
@@ -1,3 +1,5 @@
+#include "MantidQtWidgets/LegacyQwt/MantidQwtIMDWorkspaceData.h"
+#include "MantidQtWidgets/Common/QStringUtils.h"
 #include "MantidAPI/CoordTransform.h"
 #include "MantidAPI/IMDEventWorkspace.h"
 #include "MantidAPI/IMDHistoWorkspace.h"
@@ -6,9 +8,9 @@
 #include "MantidAPI/NullCoordTransform.h"
 #include "MantidGeometry/MDGeometry/IMDDimension.h"
 #include "MantidGeometry/MDGeometry/MDTypes.h"
-#include "MantidQtWidgets/LegacyQwt/MantidQwtIMDWorkspaceData.h"
 #include <QStringBuilder>
 
+using MantidQt::API::toQStringInternal;
 using namespace Mantid::Kernel;
 using namespace Mantid::Geometry;
 using Mantid::API::NullCoordTransform;
@@ -365,7 +367,7 @@ QString MantidQwtIMDWorkspaceData::getXAxisLabel() const {
     IMDDimension_const_sptr dim =
         m_originalWorkspace.lock()->getDimension(m_currentPlotAxis);
     xLabel = QString::fromStdString(dim->getName()) + " (" +
-             QString::fromStdWString(dim->getUnits().utf8()) + ")";
+             toQStringInternal(dim->getUnits().utf8()) + ")";
   } else {
     // Distance
     // Distance, or not set.
diff --git a/qt/widgets/sliceviewer/src/DimensionSliceWidget.cpp b/qt/widgets/sliceviewer/src/DimensionSliceWidget.cpp
index 646f93bc2d2f64d62a70ae4a114e23cbd5443902..3a2f263b05882aefe7b4c237e12ed8e7e5084a81 100644
--- a/qt/widgets/sliceviewer/src/DimensionSliceWidget.cpp
+++ b/qt/widgets/sliceviewer/src/DimensionSliceWidget.cpp
@@ -1,9 +1,11 @@
 #include "MantidQtWidgets/SliceViewer/DimensionSliceWidget.h"
+#include "MantidQtWidgets/Common/QStringUtils.h"
 #include "MantidKernel/UnitLabel.h"
 #include <iosfwd>
 #include <QLayout>
 
 namespace MantidQt {
+using API::toQStringInternal;
 namespace SliceViewer {
 
 DimensionSliceWidget::DimensionSliceWidget(QWidget *parent)
@@ -151,7 +153,7 @@ void DimensionSliceWidget::setMinMax(double min, double max) {
   if (!m_dim)
     return;
   ui.lblName->setText(QString::fromStdString(m_dim->getName()));
-  ui.lblUnits->setText(QString::fromStdWString(m_dim->getUnits().utf8()));
+  ui.lblUnits->setText(toQStringInternal(m_dim->getUnits().utf8()));
 
   ui.horizontalSlider->setRange(min, max, m_dim->getBinWidth());
 
diff --git a/qt/widgets/sliceviewer/src/XYLimitsDialog.cpp b/qt/widgets/sliceviewer/src/XYLimitsDialog.cpp
index de7232992fecf5623081998dfc3a20c08b7451af..b2c875a36272cf2480f28e2624e369a94d5caaf5 100644
--- a/qt/widgets/sliceviewer/src/XYLimitsDialog.cpp
+++ b/qt/widgets/sliceviewer/src/XYLimitsDialog.cpp
@@ -1,7 +1,10 @@
 #include "MantidQtWidgets/SliceViewer/XYLimitsDialog.h"
+#include "MantidQtWidgets/Common/QStringUtils.h"
 #include "MantidKernel/UnitLabel.h"
 #include <QIntValidator>
 
+using MantidQt::API::toQStringInternal;
+
 XYLimitsDialog::XYLimitsDialog(QWidget *parent) : QDialog(parent) {
   ui.setupUi(this);
   ui.textXMax->setValidator(new QDoubleValidator(ui.textXMax));
@@ -20,14 +23,14 @@ XYLimitsDialog::~XYLimitsDialog() {}
  * @param dim : IMDDimension */
 void XYLimitsDialog::setXDim(Mantid::Geometry::IMDDimension_const_sptr dim) {
   ui.lblXName->setText(QString::fromStdString(dim->getName()));
-  ui.lblXUnits->setText(QString::fromStdWString(dim->getUnits().utf8()));
+  ui.lblXUnits->setText(toQStringInternal(dim->getUnits().utf8()));
 }
 
 /** Set the labels for the Y dimensions
  * @param dim : IMDDimension */
 void XYLimitsDialog::setYDim(Mantid::Geometry::IMDDimension_const_sptr dim) {
   ui.lblYName->setText(QString::fromStdString(dim->getName()));
-  ui.lblYUnits->setText(QString::fromStdWString(dim->getUnits().utf8()));
+  ui.lblYUnits->setText(toQStringInternal(dim->getUnits().utf8()));
 }
 
 //------------------------------------------------------------------------------------------