Index: src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision c1dc994f5e72a92ae9b5204b085da03e2bcd246a)
+++ src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision 802fc18bd0862710455286204729583ac872a4c2)
@@ -1,4 +1,4 @@
 """
-    CanSAS 2D data reader for reading HDF5 formatted CanSAS files.
+    NXcanSAS data reader for reading HDF5 formatted CanSAS files.
 """
 
@@ -22,17 +22,17 @@
 class Reader(FileReader):
     """
-    A class for reading in CanSAS v2.0 data files. The existing iteration opens
-    Mantid generated HDF5 formatted files with file extension .h5/.H5. Any
-    number of data sets may be present within the file and any dimensionality
-    of data may be used. Currently 1D and 2D SAS data sets are supported, but
-    future implementations will include 1D and 2D SESANS data.
-
-    Any number of SASdata sets may be present in a SASentry and the data within
-    can be either 1D I(Q) or 2D I(Qx, Qy).
-
-    Also supports reading NXcanSAS formatted HDF5 files
+    A class for reading in NXcanSAS data files. The current implementation has
+    been tested to load data generated by multiple facilities, all of which are
+    known to produce NXcanSAS standards compliant data. Any number of data sets
+    may be present within the file and any dimensionality of data may be used.
+    Currently 1D and 2D SAS data sets are supported, but should be immediately
+    extensible to SESANS data.
+
+    Any number of SASdata groups  may be present in a SASentry and the data
+    within each SASdata group can be a single 1D I(Q), multi-framed 1D I(Q),
+    2D I(Qx, Qy) or multi-framed 2D I(Qx, Qy).
 
     :Dependencies:
-        The CanSAS HDF5 reader requires h5py => v2.5.0 or later.
+        The NXcanSAS HDF5 reader requires h5py => v2.5.0 or later.
     """
 
@@ -102,4 +102,7 @@
         self.data2d = []
         self.raw_data = None
+        self.multi_frame = False
+        self.data_frames = []
+        self.data_uncertainty_frames = []
         self.errors = []
         self.logging = []
@@ -150,6 +153,6 @@
                     self.add_data_set(key)
                 elif class_prog.match(u'SASdata'):
+                    self._find_data_attributes(value)
                     self._initialize_new_data_set(value)
-                    self._find_data_attributes(value)
                 # Recursion step to access data within the group
                 self.read_children(value, parent_list)
@@ -252,7 +255,14 @@
         """
         if key == self.i_name:
-            self.current_dataset.y = data_set.flatten()
-            self.current_dataset.yaxis("Intensity", unit)
+            if self.multi_frame:
+                for x in range(0, data_set.shape[0]):
+                    self.data_frames.append(data_set[x].flatten())
+            else:
+                self.current_dataset.y = data_set.flatten()
+                self.current_dataset.yaxis("Intensity", unit)
         elif key == self.i_uncertainties_name:
+            if self.multi_frame:
+                for x in range(0, data_set.shape[0]):
+                    self.data_uncertainty_frames.append(data_set[x].flatten())
             self.current_dataset.dy = data_set.flatten()
         elif key in self.q_names:
@@ -517,5 +527,13 @@
                 self.data2d.append(self.current_dataset)
             elif isinstance(self.current_dataset, plottable_1D):
-                self.data1d.append(self.current_dataset)
+                if self.multi_frame:
+                    for x in range(0, len(self.data_frames) - 1):
+                        self.current_dataset.y = self.data_frames[x]
+                        if len(self.data_uncertainty_frames) > x:
+                            self.current_dataset.dy = \
+                                self.data_uncertainty_frames[x]
+                        self.data1d.append(self.current_dataset)
+                else:
+                    self.data1d.append(self.current_dataset)
 
     def final_data_cleanup(self):
@@ -598,4 +616,6 @@
         if self.current_datainfo and self.current_dataset:
             self.final_data_cleanup()
+        self.data_frames = []
+        self.data_uncertainty_frames = []
         self.data1d = []
         self.data2d = []
@@ -617,11 +637,4 @@
             self.current_dataset = plottable_1D(x, y)
         self.current_datainfo.filename = self.raw_data.filename
-        self.mask_name = u''
-        self.i_name = u''
-        self.i_node = u''
-        self.i_uncertainties_name = u''
-        self.q_names = []
-        self.q_uncertainty_names = []
-        self.q_resolution_names = []
 
     @staticmethod
@@ -645,4 +658,13 @@
         :param value: SASdata/NXdata HDF5 Group
         """
+        # Initialize values to base types
+        self.mask_name = u''
+        self.i_name = u''
+        self.i_node = u''
+        self.i_uncertainties_name = u''
+        self.q_names = []
+        self.q_uncertainty_names = []
+        self.q_resolution_names = []
+        # Get attributes
         attrs = value.attrs
         signal = attrs.get("signal", "I")
@@ -652,4 +674,5 @@
         i_axes = self.check_is_list_or_array(i_axes)
         keys = value.keys()
+        # Assign attributes to appropriate class variables
         self.mask_name = attrs.get("mask")
         for val in q_indices:
@@ -676,16 +699,21 @@
                 self.i_uncertainties_name = i_vals.attrs.get("uncertainty")
 
-    def _is2d(self, value, basename="I"):
+    def _is2d(self, value, i_base="", q_base=[]):
         """
         A private class to determine if the data set is 1d or 2d.
 
-        :param parent_list: List of parents nodes in the HDF5 file
+        :param value: Nexus/NXcanSAS data group
         :param basename: Approximate name of an entry to search for
         :return: True if 2D, otherwise false
         """
-
-        vals = value.get(basename)
-        return (vals is not None and vals.shape is not None
-                and len(vals.shape) != 1)
+        i_basename = i_base if i_base != "" else self.i_name
+        i_vals = value.get(i_basename)
+        q_basename = q_base if q_base != [] else self.q_names
+        q_vals = value.get(q_basename[0])
+        self.multi_frame = True if (i_vals is not None and q_vals is not None
+                                    and len(i_vals.shape) != 1
+                                    and len(q_vals.shape) == 1) else False
+        return (i_vals is not None and i_vals.shape is not None
+                and len(i_vals.shape) != 1 and not self.multi_frame)
 
     def _create_unique_key(self, dictionary, name, numb=0):
