Index: src/sas/sascalc/dataloader/file_reader_base_class.py
===================================================================
--- src/sas/sascalc/dataloader/file_reader_base_class.py	(revision 7477fb9244fe10969ca2394fb9d2fce9f65783d9)
+++ src/sas/sascalc/dataloader/file_reader_base_class.py	(revision 0b79323fac12d588a7dd4982f986cf1a2ac3e8de)
@@ -54,5 +54,10 @@
                     self.f_open = open(filepath, 'rb')
                     self.get_file_contents()
-                    self.sort_one_d_data()
+
+                    if isinstance(self.output[0], Data1D):
+                        self.sort_one_d_data()
+                    elif isinstance(self.output[0], Data2D):
+                        self.sort_two_d_data()
+    
                 except DataReaderException as e:
                     self.handle_error_message(e.message)
@@ -124,4 +129,37 @@
         self.output = final_list
 
+    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)
+        self.output = final_list
+
     def set_all_to_none(self):
         """
Index: src/sas/sascalc/dataloader/readers/cansas_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision 7477fb9244fe10969ca2394fb9d2fce9f65783d9)
+++ src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision 0b79323fac12d588a7dd4982f986cf1a2ac3e8de)
@@ -236,5 +236,12 @@
                 self.parent_class = tagname_original
                 if tagname == 'SASdata':
-                    self.current_dataset = plottable_1D(np.array(0), np.array(0))
+                    self._initialize_new_data_set(node)
+                    if isinstance(self.current_dataset, plottable_2D):
+                        x_bins = attr.get("x_bins", "")
+                        y_bins = attr.get("y_bins", "")
+                        if x_bins is not "" and y_bins is not "":
+                            self.current_dataset.shape = (x_bins, y_bins)
+                        else:
+                            self.current_dataset.shape = ()
                 # Recurse to access data within the group
                 self._parse_entry(node, recurse=True)
@@ -250,5 +257,9 @@
                 self._add_intermediate()
             else:
-                data_point, unit = self._get_node_value(node, tagname)
+                if isinstance(self.current_dataset, plottable_2D):
+                    data_point = node.text
+                    unit = attr.get('unit', '')
+                else:
+                    data_point, unit = self._get_node_value(node, tagname)
 
                 # If this is a dataset, store the data appropriately
@@ -260,5 +271,7 @@
                 elif tagname == 'SASnote':
                     self.current_datainfo.notes.append(data_point)
-                elif tagname == 'I': # I and Q points
+
+                # I and Q points
+                elif tagname == 'I' and isinstance(self.current_dataset, plottable_1D):
                     unit_list = unit.split("|")
                     if len(unit_list) > 1:
@@ -268,5 +281,5 @@
                         self.current_dataset.yaxis("Intensity", unit)
                     self.current_dataset.y = np.append(self.current_dataset.y, data_point)
-                elif tagname == 'Idev':
+                elif tagname == 'Idev' and isinstance(self.current_dataset, plottable_1D):
                     self.current_dataset.dy = np.append(self.current_dataset.dy, data_point)
                 elif tagname == 'Q':
@@ -294,4 +307,26 @@
                 elif tagname == 'zacceptance':
                     self.current_datainfo.sample.zacceptance = (data_point, unit)
+
+                # I and Qx, Qy - 2D data
+                elif tagname == 'I' and isinstance(self.current_dataset, plottable_2D):
+                    self.current_dataset.yaxis("Intensity", unit)
+                    self.current_dataset.data = np.fromstring(data_point, dtype=float, sep=",")
+                elif tagname == 'Idev' and isinstance(self.current_dataset, plottable_2D):
+                    self.current_dataset.err_data = np.fromstring(data_point, dtype=float, sep=",")
+                elif tagname == 'Qx':
+                    self.current_dataset.xaxis("Qx", unit)
+                    self.current_dataset.qx_data = np.fromstring(data_point, dtype=float, sep=",")
+                elif tagname == 'Qy':
+                    self.current_dataset.yaxis("Qy", unit)
+                    self.current_dataset.qy_data = np.fromstring(data_point, dtype=float, sep=",")
+                elif tagname == 'Qxdev':
+                    self.current_dataset.xaxis("Qxdev", unit)
+                    self.current_dataset.dqx_data = np.fromstring(data_point, dtype=float, sep=",")
+                elif tagname == 'Qydev':
+                    self.current_dataset.yaxis("Qydev", unit)
+                    self.current_dataset.dqy_data = np.fromstring(data_point, dtype=float, sep=",")
+                elif tagname == 'Mask':
+                    inter = [item == "1" for item in data_point.split(",")]
+                    self.current_dataset.mask = np.asarray(inter, dtype=bool)
 
                 # Sample Information
@@ -647,4 +682,15 @@
                                                 np.zeros([array_size]))
 
+    def _initialize_new_data_set(self, node=None):
+        if node is not None:
+            for child in node:
+                if child.tag.replace(self.base_ns, "") == "Idata":
+                    for i_child in child:
+                        if i_child.tag.replace(self.base_ns, "") == "Qx":
+                            self.current_dataset = plottable_2D()
+                            return
+        self.current_dataset = plottable_1D(np.array(0), np.array(0))
+
+    ## Writing Methods
     def write(self, filename, datainfo):
         """
