Index: src/sas/sascalc/dataloader/file_reader_base_class.py
===================================================================
--- src/sas/sascalc/dataloader/file_reader_base_class.py	(revision 0b79323fac12d588a7dd4982f986cf1a2ac3e8de)
+++ src/sas/sascalc/dataloader/file_reader_base_class.py	(revision 9d786e572492d279fc9ae1e2c7ca8c4c8e855623)
@@ -59,5 +59,5 @@
                     elif isinstance(self.output[0], Data2D):
                         self.sort_two_d_data()
-    
+
                 except DataReaderException as e:
                     self.handle_error_message(e.message)
@@ -107,19 +107,18 @@
                 # Sort data by increasing x and remove 1st point
                 ind = np.lexsort((data.y, data.x))
-                ind = ind[1:] # Remove 1st point (Q, I) = (0, 0)
-                data.x = np.asarray([data.x[i] for i in ind])
-                data.y = np.asarray([data.y[i] for i in ind])
+                data.x = np.asarray([data.x[i] for i in ind]).astype(np.float64)
+                data.y = np.asarray([data.y[i] for i in ind]).astype(np.float64)
                 if data.dx is not None:
-                    data.dx = np.asarray([data.dx[i] for i in ind])
+                    data.dx = np.asarray([data.dx[i] for i in ind]).astype(np.float64)
                 if data.dxl is not None:
-                    data.dxl = np.asarray([data.dxl[i] for i in ind])
+                    data.dxl = np.asarray([data.dxl[i] for i in ind]).astype(np.float64)
                 if data.dxw is not None:
-                    data.dxw = np.asarray([data.dxw[i] for i in ind])
+                    data.dxw = np.asarray([data.dxw[i] for i in ind]).astype(np.float64)
                 if data.dy is not None:
-                    data.dy = np.asarray([data.dy[i] for i in ind])
+                    data.dy = np.asarray([data.dy[i] for i in ind]).astype(np.float64)
                 if data.lam is not None:
-                    data.lam = np.asarray([data.lam[i] for i in ind])
+                    data.lam = np.asarray([data.lam[i] for i in ind]).astype(np.float64)
                 if data.dlam is not None:
-                    data.dlam = np.asarray([data.dlam[i] for i in ind])
+                    data.dlam = np.asarray([data.dlam[i] for i in ind]).astype(np.float64)
                 data.xmin = np.min(data.x)
                 data.xmax = np.max(data.x)
@@ -128,36 +127,38 @@
             final_list.append(data)
         self.output = final_list
+        self.remove_empty_q_values()
 
     def sort_two_d_data(self):
         final_list = []
         for dataset in self.output:
-            dataset.data = dataset.data.astype(np.float64)
-            dataset.qx_data = dataset.qx_data.astype(np.float64)
-            dataset.xmin = np.min(dataset.qx_data)
-            dataset.xmax = np.max(dataset.qx_data)
-            dataset.qy_data = dataset.qy_data.astype(np.float64)
-            dataset.ymin = np.min(dataset.qy_data)
-            dataset.ymax = np.max(dataset.qy_data)
-            dataset.q_data = np.sqrt(dataset.qx_data * dataset.qx_data
-                                     + dataset.qy_data * dataset.qy_data)
-            if dataset.err_data is not None:
-                dataset.err_data = dataset.err_data.astype(np.float64)
-            if dataset.dqx_data is not None:
-                dataset.dqx_data = dataset.dqx_data.astype(np.float64)
-            if dataset.dqy_data is not None:
-                dataset.dqy_data = dataset.dqy_data.astype(np.float64)
-            if dataset.mask is not None:
-                dataset.mask = dataset.mask.astype(dtype=bool)
-
-            if len(dataset.shape) == 2:
-                n_rows, n_cols = dataset.shape
-                dataset.y_bins = dataset.qy_data[0::int(n_cols)]
-                dataset.x_bins = dataset.qx_data[:int(n_cols)]
-                dataset.data = dataset.data.flatten()
-            else:
-                dataset.y_bins = []
-                dataset.x_bins = []
-                dataset.data = dataset.data.flatten()
-            final_list.append(dataset)
+            if isinstance(dataset, Data2D):
+                dataset.data = dataset.data.astype(np.float64)
+                dataset.qx_data = dataset.qx_data.astype(np.float64)
+                dataset.xmin = np.min(dataset.qx_data)
+                dataset.xmax = np.max(dataset.qx_data)
+                dataset.qy_data = dataset.qy_data.astype(np.float64)
+                dataset.ymin = np.min(dataset.qy_data)
+                dataset.ymax = np.max(dataset.qy_data)
+                dataset.q_data = np.sqrt(dataset.qx_data * dataset.qx_data
+                                         + dataset.qy_data * dataset.qy_data)
+                if dataset.err_data is not None:
+                    dataset.err_data = dataset.err_data.astype(np.float64)
+                if dataset.dqx_data is not None:
+                    dataset.dqx_data = dataset.dqx_data.astype(np.float64)
+                if dataset.dqy_data is not None:
+                    dataset.dqy_data = dataset.dqy_data.astype(np.float64)
+                if dataset.mask is not None:
+                    dataset.mask = dataset.mask.astype(dtype=bool)
+
+                if len(dataset.data.shape) == 2:
+                    n_rows, n_cols = dataset.data.shape
+                    dataset.y_bins = dataset.qy_data[0::int(n_cols)]
+                    dataset.x_bins = dataset.qx_data[:int(n_cols)]
+                    dataset.data = dataset.data.flatten()
+                else:
+                    dataset.y_bins = []
+                    dataset.x_bins = []
+                    dataset.data = dataset.data.flatten()
+                final_list.append(dataset)
         self.output = final_list
 
Index: src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision 7f75a3fc9b6c1be1b8f3ee54e1879b3fd8f5e4d6)
+++ src/sas/sascalc/dataloader/readers/cansas_reader_HDF5.py	(revision 9d786e572492d279fc9ae1e2c7ca8c4c8e855623)
@@ -14,7 +14,8 @@
 from sas.sascalc.dataloader.data_info import combine_data_info_with_plottable
 from sas.sascalc.dataloader.loader_exceptions import FileContentsException
-
-
-class Reader():
+from sas.sascalc.dataloader.file_reader_base_class import FileReader
+
+
+class Reader(FileReader):
     """
     A class for reading in CanSAS v2.0 data files. The existing iteration opens
@@ -41,8 +42,4 @@
     # Raw file contents to be processed
     raw_data = None
-    # Data info currently being read in
-    current_datainfo = None
-    # SASdata set currently being read in
-    current_dataset = None
     # List of plottable1D objects that should be linked to the current_datainfo
     data1d = None
@@ -57,8 +54,6 @@
     # Flag to bypass extension check
     allow_all = True
-    # List of files to return
-    output = None
-
-    def read(self, filename):
+
+    def get_file_contents(self):
         """
         This is the general read method that all SasView data_loaders must have.
@@ -69,4 +64,8 @@
         # Reinitialize when loading a new data file to reset all class variables
         self.reset_class_variables()
+
+        filename = self.f_open.name
+        self.f_open.close() # IO handled by h5py
+
         # Check that the file exists
         if os.path.isfile(filename):
@@ -431,5 +430,4 @@
         Data1D and Data2D objects
         """
-
         # Type cast data arrays to float64
         if len(self.current_datainfo.trans_spectrum) > 0:
@@ -455,20 +453,4 @@
         # Type cast data arrays to float64 and find min/max as appropriate
         for dataset in self.data2d:
-            dataset.data = dataset.data.astype(np.float64)
-            dataset.err_data = dataset.err_data.astype(np.float64)
-            if dataset.qx_data is not None:
-                dataset.xmin = np.min(dataset.qx_data)
-                dataset.xmax = np.max(dataset.qx_data)
-                dataset.qx_data = dataset.qx_data.astype(np.float64)
-            if dataset.dqx_data is not None:
-                dataset.dqx_data = dataset.dqx_data.astype(np.float64)
-            if dataset.qy_data is not None:
-                dataset.ymin = np.min(dataset.qy_data)
-                dataset.ymax = np.max(dataset.qy_data)
-                dataset.qy_data = dataset.qy_data.astype(np.float64)
-            if dataset.dqy_data is not None:
-                dataset.dqy_data = dataset.dqy_data.astype(np.float64)
-            if dataset.q_data is not None:
-                dataset.q_data = dataset.q_data.astype(np.float64)
             zeros = np.ones(dataset.data.size, dtype=bool)
             try:
@@ -493,29 +475,10 @@
                 dataset.x_bins = dataset.qx_data[:n_cols]
                 dataset.data = dataset.data.flatten()
-
-            final_dataset = combine_data_info_with_plottable(
-                dataset, self.current_datainfo)
-            self.output.append(final_dataset)
+            self.current_dataset = dataset
+            self.send_to_output()
 
         for dataset in self.data1d:
-            if dataset.x is not None:
-                dataset.x = dataset.x.astype(np.float64)
-                dataset.xmin = np.min(dataset.x)
-                dataset.xmax = np.max(dataset.x)
-            if dataset.y is not None:
-                dataset.y = dataset.y.astype(np.float64)
-                dataset.ymin = np.min(dataset.y)
-                dataset.ymax = np.max(dataset.y)
-            if dataset.dx is not None:
-                dataset.dx = dataset.dx.astype(np.float64)
-            if dataset.dxl is not None:
-                dataset.dxl = dataset.dxl.astype(np.float64)
-            if dataset.dxw is not None:
-                dataset.dxw = dataset.dxw.astype(np.float64)
-            if dataset.dy is not None:
-                dataset.dy = dataset.dy.astype(np.float64)
-            final_dataset = combine_data_info_with_plottable(
-                dataset, self.current_datainfo)
-            self.output.append(final_dataset)
+            self.current_dataset = dataset
+            self.send_to_output()
 
     def add_data_set(self, key=""):
