Index: src/sas/sascalc/dataloader/readers/abs_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/abs_reader.py	(revision ad92c5a96ecb73ee7094bafca363a6a7a61a530d)
+++ src/sas/sascalc/dataloader/readers/abs_reader.py	(revision 7b07fbe306fb8a4fe61838f12a869394e2e47c0a)
@@ -202,5 +202,5 @@
                 is_data_started = True
 
-        self.remove_empty_q_values(True, True)
+        self.remove_empty_q_values()
 
         # Sanity check
Index: src/sas/sascalc/dataloader/readers/ascii_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/ascii_reader.py	(revision f994e8b1aa05e01ca78e9e360337d188540cd1bc)
+++ src/sas/sascalc/dataloader/readers/ascii_reader.py	(revision 7b07fbe306fb8a4fe61838f12a869394e2e47c0a)
@@ -156,5 +156,5 @@
             raise FileContentsException(msg)
 
-        self.remove_empty_q_values(has_error_dx, has_error_dy)
+        self.remove_empty_q_values()
         self.current_dataset.xaxis("\\rm{Q}", 'A^{-1}')
         self.current_dataset.yaxis("\\rm{Intensity}", "cm^{-1}")
Index: src/sas/sascalc/dataloader/readers/cansas_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision ae69c690bae8eb1cae0c6902dd71755dda9710f8)
+++ src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision 7b07fbe306fb8a4fe61838f12a869394e2e47c0a)
@@ -104,29 +104,16 @@
             xml_file = self.f_open.name
         # We don't sure f_open since lxml handles opnening/closing files
-        if not self.f_open.closed:
-            self.f_open.close()
-
-        basename, _ = os.path.splitext(os.path.basename(xml_file))
-
         try:
             # Raises FileContentsException
             self.load_file_and_schema(xml_file, schema_path)
-            self.current_datainfo = DataInfo()
-            # Raises FileContentsException if file doesn't meet CanSAS schema
+            # Parse each SASentry
+            entry_list = self.xmlroot.xpath('/ns:SASroot/ns:SASentry',
+                                            namespaces={
+                                                'ns': self.cansas_defaults.get(
+                                                    "ns")
+                                            })
             self.is_cansas(self.extension)
-            self.invalid = False # If we reach this point then file must be valid CanSAS
-
-            # Parse each SASentry
-            entry_list = self.xmlroot.xpath('/ns:SASroot/ns:SASentry', namespaces={
-                'ns': self.cansas_defaults.get("ns")
-            })
-            # Look for a SASentry
-            self.names.append("SASentry")
             self.set_processing_instructions()
-
             for entry in entry_list:
-                self.current_datainfo.filename = basename + self.extension
-                self.current_datainfo.meta_data["loader"] = "CanSAS XML 1D"
-                self.current_datainfo.meta_data[PREPROCESS] = self.processing_instructions
                 self._parse_entry(entry)
                 self.data_cleanup()
@@ -150,4 +137,6 @@
                     invalid_xml = self.find_invalid_xml()
                     if invalid_xml != "":
+                        basename, _ = os.path.splitext(
+                            os.path.basename(self.f_open.name))
                         invalid_xml = INVALID_XML.format(basename + self.extension) + invalid_xml
                         raise DataReaderException(invalid_xml) # Handled by base class
@@ -164,5 +153,7 @@
         except Exception as e: # Convert all other exceptions to FileContentsExceptions
             raise FileContentsException(e.message)
-
+        finally:
+            if not self.f_open.closed:
+                self.f_open.close()
 
     def load_file_and_schema(self, xml_file, schema_path=""):
@@ -209,12 +200,21 @@
         if not self._is_call_local() and not recurse:
             self.reset_state()
+        if not recurse:
+            self.current_datainfo = DataInfo()
+            # Raises FileContentsException if file doesn't meet CanSAS schema
+            self.invalid = False
+            # Look for a SASentry
             self.data = []
-            self.current_datainfo = DataInfo()
+            self.parent_class = "SASentry"
             self.names.append("SASentry")
-            self.parent_class = "SASentry"
+            self.current_datainfo.meta_data["loader"] = "CanSAS XML 1D"
+            self.current_datainfo.meta_data[
+                PREPROCESS] = self.processing_instructions
+        if self._is_call_local() and not recurse:
+            basename, _ = os.path.splitext(os.path.basename(self.f_open.name))
+            self.current_datainfo.filename = basename + self.extension
         # Create an empty dataset if no data has been passed to the reader
         if self.current_dataset is None:
-            self.current_dataset = plottable_1D(np.empty(0), np.empty(0),
-                np.empty(0), np.empty(0))
+            self._initialize_new_data_set(dom)
         self.base_ns = "{" + CANSAS_NS.get(self.cansas_version).get("ns") + "}"
 
@@ -228,5 +228,5 @@
             tagname_original = tagname
             # Skip this iteration when loading in save state information
-            if tagname == "fitting_plug_in" or tagname == "pr_inversion" or tagname == "invariant":
+            if tagname in ["fitting_plug_in", "pr_inversion", "invariant", "corfunc"]:
                 continue
             # Get where to store content
@@ -258,4 +258,5 @@
                 self._add_intermediate()
             else:
+                # TODO: Clean this up to make it faster (fewer if/elifs)
                 if isinstance(self.current_dataset, plottable_2D):
                     data_point = node.text
@@ -502,22 +503,5 @@
             self.sort_two_d_data()
             self.reset_data_list()
-            empty = None
-            return self.output[0], empty
-
-    def data_cleanup(self):
-        """
-        Clean up the data sets and refresh everything
-        :return: None
-        """
-        has_error_dx = self.current_dataset.dx is not None
-        has_error_dxl = self.current_dataset.dxl is not None
-        has_error_dxw = self.current_dataset.dxw is not None
-        has_error_dy = self.current_dataset.dy is not None
-        self.remove_empty_q_values(has_error_dx=has_error_dx,
-                                   has_error_dxl=has_error_dxl,
-                                   has_error_dxw=has_error_dxw,
-                                   has_error_dy=has_error_dy)
-        self.send_to_output()  # Combine datasets with DataInfo
-        self.current_datainfo = DataInfo()  # Reset DataInfo
+            return self.output[0], None
 
     def _is_call_local(self):
@@ -553,5 +537,4 @@
             self.aperture = Aperture()
         elif self.parent_class == 'SASdata':
-            self._check_for_empty_resolution()
             self.data.append(self.current_dataset)
 
@@ -665,35 +648,4 @@
         return node_value, value_unit
 
-    def _check_for_empty_resolution(self):
-        """
-        a method to check all resolution data sets are the same size as I and q
-        """
-        dql_exists = False
-        dqw_exists = False
-        dq_exists = False
-        di_exists = False
-        if self.current_dataset.dxl is not None:
-            dql_exists = True
-        if self.current_dataset.dxw is not None:
-            dqw_exists = True
-        if self.current_dataset.dx is not None:
-            dq_exists = True
-        if self.current_dataset.dy is not None:
-            di_exists = True
-        if dqw_exists and not dql_exists:
-            array_size = self.current_dataset.dxw.size
-            self.current_dataset.dxl = np.zeros(array_size)
-        elif dql_exists and not dqw_exists:
-            array_size = self.current_dataset.dxl.size
-            self.current_dataset.dxw = np.zeros(array_size)
-        elif not dql_exists and not dqw_exists and not dq_exists:
-            array_size = self.current_dataset.x.size
-            self.current_dataset.dx = np.append(self.current_dataset.dx,
-                                                np.zeros([array_size]))
-        if not di_exists:
-            array_size = self.current_dataset.y.size
-            self.current_dataset.dy = np.append(self.current_dataset.dy,
-                                                np.zeros([array_size]))
-
     def _initialize_new_data_set(self, node=None):
         if node is not None:
