diff --git a/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h b/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h
index 7dc11e6e2e855a9bf237bd5feffc7bc934abb650..1d6da5f86a70d89003326c84ef0a0771ce26f6a1 100644
--- a/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h
+++ b/Framework/DataHandling/inc/MantidDataHandling/LoadNexusProcessed.h
@@ -165,6 +165,7 @@ private:
   void loadBlock(Mantid::NeXus::NXDataSetTyped<double> &data,
                  Mantid::NeXus::NXDataSetTyped<double> &errors,
                  Mantid::NeXus::NXDataSetTyped<double> &farea, bool hasFArea,
+                 Mantid::NeXus::NXDouble &xErrors, bool hasXErrors,
                  int64_t blocksize, int64_t nchannels, int64_t &hist,
                  API::MatrixWorkspace_sptr local_workspace);
 
@@ -173,12 +174,14 @@ private:
   void loadBlock(Mantid::NeXus::NXDataSetTyped<double> &data,
                  Mantid::NeXus::NXDataSetTyped<double> &errors,
                  Mantid::NeXus::NXDataSetTyped<double> &farea, bool hasFArea,
+                 Mantid::NeXus::NXDouble &xErrors, bool hasXErrors,
                  int64_t blocksize, int64_t nchannels, int64_t &hist,
                  int64_t &wsIndex, API::MatrixWorkspace_sptr local_workspace);
   /// Load a block of data into the workspace
   void loadBlock(Mantid::NeXus::NXDataSetTyped<double> &data,
                  Mantid::NeXus::NXDataSetTyped<double> &errors,
                  Mantid::NeXus::NXDataSetTyped<double> &farea, bool hasFArea,
+                 Mantid::NeXus::NXDouble &xErrors, bool hasXErrors,
                  Mantid::NeXus::NXDouble &xbins, int64_t blocksize,
                  int64_t nchannels, int64_t &hist, int64_t &wsIndex,
                  API::MatrixWorkspace_sptr local_workspace);
diff --git a/Framework/DataHandling/src/LoadNexusProcessed.cpp b/Framework/DataHandling/src/LoadNexusProcessed.cpp
index f3ced90647955c8499c35927399f21af3b4b736c..cb61f6a3b650d72458886fac739f4e3f5a616a9b 100644
--- a/Framework/DataHandling/src/LoadNexusProcessed.cpp
+++ b/Framework/DataHandling/src/LoadNexusProcessed.cpp
@@ -1293,6 +1293,11 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
     fracarea = wksp_cls.openNXDouble("frac_area");
   }
 
+  // Check for x errors; as with fracArea we set it to xbins
+  // although in this case it would never be used.
+  auto hasXErrors = wksp_cls.isValid("xerrors");
+  NXDouble &xErrors = hasXErrors ? wksp_cls.openNXDouble("xerrors") : xbins;
+
   int64_t blocksize(8);
   // const int fullblocks = nspectra / blocksize;
   // size of the workspace
@@ -1325,12 +1330,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
                        progressScaler * static_cast<double>(hist_index) /
                            static_cast<double>(read_stop),
                    "Reading workspace data...");
-          loadBlock(data, errors, fracarea, hasFracArea, blocksize, nchannels,
+          loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, blocksize, nchannels,
                     hist_index, wsIndex, local_workspace);
         }
         int64_t finalblock = m_spec_max - 1 - read_stop;
         if (finalblock > 0) {
-          loadBlock(data, errors, fracarea, hasFracArea, finalblock, nchannels,
+          loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, finalblock, nchannels,
                     hist_index, wsIndex, local_workspace);
         }
       }
@@ -1344,7 +1349,7 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
                        progressScaler * static_cast<double>(specIndex) /
                            static_cast<double>(m_spec_list.size()),
                    "Reading workspace data...");
-          loadBlock(data, errors, fracarea, hasFracArea,
+          loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors,
                     static_cast<int64_t>(1), nchannels, specIndex, wsIndex,
                     local_workspace);
         }
@@ -1355,12 +1360,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
                      progressScaler * static_cast<double>(hist_index) /
                          static_cast<double>(read_stop),
                  "Reading workspace data...");
-        loadBlock(data, errors, fracarea, hasFracArea, blocksize, nchannels,
+        loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, blocksize, nchannels,
                   hist_index, wsIndex, local_workspace);
       }
       int64_t finalblock = total_specs - read_stop;
       if (finalblock > 0) {
-        loadBlock(data, errors, fracarea, hasFracArea, finalblock, nchannels,
+        loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, finalblock, nchannels,
                   hist_index, wsIndex, local_workspace);
       }
     }
@@ -1383,12 +1388,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
                        progressScaler * static_cast<double>(hist_index) /
                            static_cast<double>(read_stop),
                    "Reading workspace data...");
-          loadBlock(data, errors, fracarea, hasFracArea, xbins, blocksize,
+          loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, blocksize,
                     nchannels, hist_index, wsIndex, local_workspace);
         }
         int64_t finalblock = m_spec_max - 1 - read_stop;
         if (finalblock > 0) {
-          loadBlock(data, errors, fracarea, hasFracArea, xbins, finalblock,
+          loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, finalblock,
                     nchannels, hist_index, wsIndex, local_workspace);
         }
       }
@@ -1401,7 +1406,7 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
                        progressScaler * static_cast<double>(specIndex) /
                            static_cast<double>(read_stop),
                    "Reading workspace data...");
-          loadBlock(data, errors, fracarea, hasFracArea, xbins, 1, nchannels,
+          loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, 1, nchannels,
                     specIndex, wsIndex, local_workspace);
         }
       }
@@ -1411,12 +1416,12 @@ API::MatrixWorkspace_sptr LoadNexusProcessed::loadNonEventEntry(
                      progressScaler * static_cast<double>(hist_index) /
                          static_cast<double>(read_stop),
                  "Reading workspace data...");
-        loadBlock(data, errors, fracarea, hasFracArea, xbins, blocksize,
+        loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, blocksize,
                   nchannels, hist_index, wsIndex, local_workspace);
       }
       int64_t finalblock = total_specs - read_stop;
       if (finalblock > 0) {
-        loadBlock(data, errors, fracarea, hasFracArea, xbins, finalblock,
+        loadBlock(data, errors, fracarea, hasFracArea, xErrors, hasXErrors, xbins, finalblock,
                   nchannels, hist_index, wsIndex, local_workspace);
       }
     }
@@ -1812,6 +1817,8 @@ void LoadNexusProcessed::readBinMasking(
  * @param errors :: The NXDataSet object of error values
  * @param farea :: The NXDataSet object of fraction area values
  * @param hasFArea :: Flag to signal a RebinnedOutput workspace is in use
+ * @param xErrors :: The NXDataSet object of xError values
+ * @param hasXErrors :: Flag to signal the File contains x errors
  * @param blocksize :: The blocksize to use
  * @param nchannels :: The number of channels for the block
  * @param hist :: The workspace index to start reading into
@@ -1820,6 +1827,7 @@ void LoadNexusProcessed::readBinMasking(
 void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
                                    NXDataSetTyped<double> &errors,
                                    NXDataSetTyped<double> &farea, bool hasFArea,
+                                   NXDouble &xErrors, bool hasXErrors,
                                    int64_t blocksize, int64_t nchannels,
                                    int64_t &hist,
                                    API::MatrixWorkspace_sptr local_workspace) {
@@ -1831,6 +1839,9 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
   double *err_end = err_start + nchannels;
   double *farea_start = NULL;
   double *farea_end = NULL;
+  const int64_t nxbins(m_xbins->size());
+  double *xErrors_start = NULL;
+  double *xErrors_end = NULL;
   RebinnedOutput_sptr rb_workspace;
   if (hasFArea) {
     farea.load(static_cast<int>(blocksize), static_cast<int>(hist));
@@ -1838,6 +1849,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
     farea_end = farea_start + nchannels;
     rb_workspace = boost::dynamic_pointer_cast<RebinnedOutput>(local_workspace);
   }
+  if (hasXErrors) {
+    xErrors.load(static_cast<int>(blocksize), static_cast<int>(hist));
+    xErrors_start = xErrors();
+    xErrors_end = xErrors_start + nxbins;
+  }
+
   int64_t final(hist + blocksize);
   while (hist < final) {
     MantidVec &Y = local_workspace->dataY(hist);
@@ -1854,6 +1871,13 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
       farea_start += nchannels;
       farea_end += nchannels;
     }
+    if (hasXErrors) {
+      MantidVec &DX = local_workspace->dataDx(hist);
+      DX.assign(xErrors_start, xErrors_end);
+      xErrors_start += nxbins;
+      xErrors_end += nxbins;
+    }
+
     local_workspace->setX(hist, m_xbins);
     ++hist;
   }
@@ -1868,6 +1892,8 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
  * @param errors :: The NXDataSet object of error values
  * @param farea :: The NXDataSet object of fraction area values
  * @param hasFArea :: Flag to signal a RebinnedOutput workspace is in use
+ * @param xErrors :: The NXDataSet object of xError values
+ * @param hasXErrors :: Flag to signal the File contains x errors
  * @param blocksize :: The blocksize to use
  * @param nchannels :: The number of channels for the block
  * @param hist :: The workspace index to start reading into
@@ -1878,6 +1904,7 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
 void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
                                    NXDataSetTyped<double> &errors,
                                    NXDataSetTyped<double> &farea, bool hasFArea,
+                                   NXDouble &xErrors, bool hasXErrors,
                                    int64_t blocksize, int64_t nchannels,
                                    int64_t &hist, int64_t &wsIndex,
                                    API::MatrixWorkspace_sptr local_workspace) {
@@ -1889,6 +1916,9 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
   double *err_end = err_start + nchannels;
   double *farea_start = NULL;
   double *farea_end = NULL;
+  const int64_t nxbins(m_xbins->size());
+  double *xErrors_start = NULL;
+  double *xErrors_end = NULL;
   RebinnedOutput_sptr rb_workspace;
   if (hasFArea) {
     farea.load(static_cast<int>(blocksize), static_cast<int>(hist));
@@ -1896,6 +1926,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
     farea_end = farea_start + nchannels;
     rb_workspace = boost::dynamic_pointer_cast<RebinnedOutput>(local_workspace);
   }
+  if (hasXErrors) {
+    xErrors.load(static_cast<int>(blocksize), static_cast<int>(hist));
+    xErrors_start = xErrors();
+    xErrors_end = xErrors_start + nxbins;
+  }
+
   int64_t final(hist + blocksize);
   while (hist < final) {
     MantidVec &Y = local_workspace->dataY(wsIndex);
@@ -1912,6 +1948,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
       farea_start += nchannels;
       farea_end += nchannels;
     }
+    if (hasXErrors) {
+      MantidVec &DX = local_workspace->dataDx(wsIndex);
+      DX.assign(xErrors_start, xErrors_end);
+      xErrors_start += nxbins;
+      xErrors_end += nxbins;
+    }
     local_workspace->setX(wsIndex, m_xbins);
     ++hist;
     ++wsIndex;
@@ -1927,6 +1969,8 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
  * @param errors :: The NXDataSet object of error values
  * @param farea :: The NXDataSet object of fraction area values
  * @param hasFArea :: Flag to signal a RebinnedOutput workspace is in use
+ * @param xErrors :: The NXDataSet object of xError values
+ * @param hasXErrors :: Flag to signal the File contains x errors
  * @param xbins :: The xbin NXDataSet
  * @param blocksize :: The blocksize to use
  * @param nchannels :: The number of channels for the block
@@ -1937,6 +1981,7 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
 void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
                                    NXDataSetTyped<double> &errors,
                                    NXDataSetTyped<double> &farea, bool hasFArea,
+                                   NXDouble &xErrors, bool hasXErrors,
                                    NXDouble &xbins, int64_t blocksize,
                                    int64_t nchannels, int64_t &hist,
                                    int64_t &wsIndex,
@@ -1949,6 +1994,8 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
   double *err_end = err_start + nchannels;
   double *farea_start = NULL;
   double *farea_end = NULL;
+  double *xErrors_start = NULL;
+  double *xErrors_end = NULL;
   RebinnedOutput_sptr rb_workspace;
   if (hasFArea) {
     farea.load(static_cast<int>(blocksize), static_cast<int>(hist));
@@ -1961,6 +2008,13 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
   double *xbin_start = xbins();
   double *xbin_end = xbin_start + nxbins;
   int64_t final(hist + blocksize);
+
+  if (hasXErrors) {
+    xErrors.load(static_cast<int>(blocksize), static_cast<int>(hist));
+    xErrors_start = xErrors();
+    xErrors_end = xErrors_start + nxbins;
+  }
+
   while (hist < final) {
     MantidVec &Y = local_workspace->dataY(wsIndex);
     Y.assign(data_start, data_end);
@@ -1976,6 +2030,12 @@ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> &data,
       farea_start += nchannels;
       farea_end += nchannels;
     }
+    if (hasXErrors) {
+      MantidVec &DX = local_workspace->dataDx(wsIndex);
+      DX.assign(xErrors_start, xErrors_end);
+      xErrors_start += nxbins;
+      xErrors_end += nxbins;
+    }
     MantidVec &X = local_workspace->dataX(wsIndex);
     X.assign(xbin_start, xbin_end);
     xbin_start += nxbins;
diff --git a/Framework/Nexus/src/NexusFileIO.cpp b/Framework/Nexus/src/NexusFileIO.cpp
index 8f8ba1d825b97cad4683e11b245706a20ec21126..7774e62dcd9d00449d148328fb761033c2b80031 100644
--- a/Framework/Nexus/src/NexusFileIO.cpp
+++ b/Framework/Nexus/src/NexusFileIO.cpp
@@ -376,22 +376,6 @@ int NexusFileIO::writeNexusProcessedData2D(
       start[0]++;
     }
 
-    // Potentially x error
-    if (localworkspace->hasDx(0)) {
-      name = "xerrors";
-      NXcompmakedata(fileID, name.c_str(), NX_FLOAT64, 2, dims_array,
-                     m_nexuscompression, asize);
-      NXopendata(fileID, name.c_str());
-      start[0] = 0;
-      for (size_t i = 0; i < nSpect; i++) {
-        int s = spec[i];
-        NXputslab(fileID, reinterpret_cast<void *>(const_cast<double *>(
-                              &(localworkspace->readDx(s)[0]))),
-                  start, asize);
-        start[0]++;
-      }
-    }
-
     if (m_progress != 0)
       m_progress->reportIncrement(1, "Writing data");
 
@@ -425,6 +409,7 @@ int NexusFileIO::writeNexusProcessedData2D(
     NXopendata(fileID, "axis1");
     NXputdata(fileID, reinterpret_cast<void *>(const_cast<double *>(
                           &(localworkspace->readX(0)[0]))));
+
   } else {
     dims_array[0] = static_cast<int>(nSpect);
     dims_array[1] = static_cast<int>(localworkspace->readX(0).size());
@@ -439,6 +424,26 @@ int NexusFileIO::writeNexusProcessedData2D(
       start[0]++;
     }
   }
+
+  // Potentially x error
+  if (localworkspace->hasDx(0)) {
+    dims_array[0] = static_cast<int>(nSpect);
+    dims_array[1] = static_cast<int>(localworkspace->readX(0).size());
+    std::string dxErrorName = "xerrors";
+    NXcompmakedata(fileID, dxErrorName.c_str(), NX_FLOAT64, 2, dims_array,
+                    m_nexuscompression, asize);
+    NXopendata(fileID, dxErrorName.c_str());
+    start[0] = 0;
+    asize[1] = dims_array[1];
+    for (size_t i = 0; i < nSpect; i++) {
+      int s = spec[i];
+      NXputslab(fileID, reinterpret_cast<void *>(const_cast<double *>(
+                            &(localworkspace->readDx(s)[0]))),
+                start, asize);
+      start[0]++;
+    }
+  }
+
   std::string dist = (localworkspace->isDistribution()) ? "1" : "0";
   NXputattr(fileID, "distribution",
             reinterpret_cast<void *>(const_cast<char *>(dist.c_str())), 2,