Index: src/sas/sasgui/perspectives/file_converter/cansas_writer.py
===================================================================
--- src/sas/sasgui/perspectives/file_converter/cansas_writer.py	(revision 8976865459a89ad49ea825edc2e2cae17b5b512b)
+++ src/sas/sasgui/perspectives/file_converter/cansas_writer.py	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
@@ -6,5 +6,5 @@
 class CansasWriter(CansasReader):
 
-    def write(self, filename, datainfo, sasentry_attrs=None):
+    def write(self, filename, frame_data, sasentry_attrs=None):
         """
         Write the content of a Data1D as a CanSAS XML file
@@ -14,5 +14,5 @@
         """
         # Create XML document
-        doc, _ = self._to_xml_doc(datainfo, sasentry_attrs)
+        doc, _ = self._to_xml_doc(frame_data, sasentry_attrs)
         # Write the file
         file_ref = open(filename, 'w')
@@ -24,12 +24,14 @@
 
 
-    def _to_xml_doc(self, datainfo, sasentry_attrs=None):
+    def _to_xml_doc(self, frame_data, sasentry_attrs=None):
         """
-        Create an XML document to contain the content of a Data1D
+        Create an XML document to contain the content of an array of Data1Ds
 
-        :param datainfo: Data1D object
+        :param frame_data: An array of Data1D objects
         """
-        if not issubclass(datainfo.__class__, Data1D):
-            raise RuntimeError, "The cansas writer expects a Data1D instance"
+        valid_class = all([issubclass(data.__class__, Data1D) for data in frame_data])
+        if not valid_class:
+            raise RuntimeError, ("The cansas writer expects an array of "
+                "Data1D instances")
 
         # Get PIs and create root element
@@ -46,4 +48,6 @@
         root.append(entry_node)
 
+        # Use the first element in the array for writing metadata
+        datainfo = frame_data[0]
         # Add Title to SASentry
         self.write_node(entry_node, "Title", datainfo.title)
@@ -51,5 +55,5 @@
         self._write_run_names(datainfo, entry_node)
         # Add Data info to SASEntry
-        self._write_data(datainfo, entry_node)
+        self._write_data(frame_data, entry_node)
         # Transmission Spectrum Info
         self._write_trans_spectrum(datainfo, entry_node)
@@ -70,4 +74,36 @@
         # Return the document, and the SASentry node associated with
         #      the data we just wrote
-        
+
         return doc, entry_node
+
+    def _write_data(self, frame_data, entry_node):
+        """
+        Writes the I and Q data to the XML file
+
+        :param datainfo: The Data1D object the information is coming from
+        :param entry_node: lxml node ElementTree object to be appended to
+        """
+        for datainfo in frame_data:
+            node = self.create_element("SASdata")
+            self.append(node, entry_node)
+
+            for i in range(len(datainfo.x)):
+                point = self.create_element("Idata")
+                node.append(point)
+                self.write_node(point, "Q", datainfo.x[i],
+                                {'unit': datainfo.x_unit})
+                if len(datainfo.y) >= i:
+                    self.write_node(point, "I", datainfo.y[i],
+                                    {'unit': datainfo.y_unit})
+                if datainfo.dy != None and len(datainfo.dy) > i:
+                    self.write_node(point, "Idev", datainfo.dy[i],
+                                    {'unit': datainfo.y_unit})
+                if datainfo.dx != None and len(datainfo.dx) > i:
+                    self.write_node(point, "Qdev", datainfo.dx[i],
+                                    {'unit': datainfo.x_unit})
+                if datainfo.dxw != None and len(datainfo.dxw) > i:
+                    self.write_node(point, "dQw", datainfo.dxw[i],
+                                    {'unit': datainfo.x_unit})
+                if datainfo.dxl != None and len(datainfo.dxl) > i:
+                    self.write_node(point, "dQl", datainfo.dxl[i],
+                                    {'unit': datainfo.x_unit})
Index: src/sas/sasgui/perspectives/file_converter/converter_panel.py
===================================================================
--- src/sas/sasgui/perspectives/file_converter/converter_panel.py	(revision 8976865459a89ad49ea825edc2e2cae17b5b512b)
+++ src/sas/sasgui/perspectives/file_converter/converter_panel.py	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
@@ -14,4 +14,5 @@
 from sas.sasgui.perspectives.file_converter.meta_panels import SamplePanel
 from sas.sasgui.perspectives.file_converter.meta_panels import SourcePanel
+from sas.sasgui.perspectives.file_converter.frame_select_dialog import FrameSelectDialog
 from sas.sasgui.guiframe.events import StatusEvent
 from sas.sasgui.guiframe.documentation_window import DocumentationWindow
@@ -105,4 +106,39 @@
         return np.array(data, dtype=np.float32)
 
+    def ask_frame_range(self, n_frames):
+        valid_input = False
+        dlg = FrameSelectDialog(n_frames)
+        frames = None
+        increment = None
+        while not valid_input:
+            if dlg.ShowModal() == wx.ID_OK:
+                msg = ""
+                try:
+                    first_frame = int(dlg.first_input.GetValue())
+                    last_frame = int(dlg.last_input.GetValue())
+                    increment = int(dlg.increment_input.GetValue())
+                    if last_frame < 0 or first_frame < 0:
+                        msg = "Frame values must be positive"
+                    elif increment < 1:
+                        msg = "Increment must be greater than or equal to 1"
+                    elif first_frame > last_frame:
+                        msg = "First frame must be less than last frame"
+                    elif last_frame > n_frames:
+                        msg = "Last frame must be less than {}".format(n_frames)
+                    else:
+                        valid_input = True
+                except:
+                    valid_input = False
+                    msg = "Please enter valid integer values"
+
+                if not valid_input:
+                    wx.PostEvent(self.parent.manager.parent,
+                        StatusEvent(status=msg))
+            else:
+                return [], 0
+        frames = range(first_frame, last_frame + increment,
+            increment)
+        return frames, increment
+
     def on_convert(self, event):
         if not self.validate_inputs():
@@ -120,5 +156,10 @@
                 bsl_data = loader.load_bsl_data()
                 qdata = bsl_data.q_axis.data[0]
-                iqdata = bsl_data.data_axis.data[0]
+                iqdata = bsl_data.data_axis.data
+                frames = [iqdata.shape[0]]
+                increment = 1
+                if frames[0] > 3:
+                    frames, increment = self.ask_frame_range(frames[0])
+                    if frames == []: return
         except Exception as ex:
             msg = str(ex)
@@ -128,6 +169,4 @@
 
         output_path = self.output.GetPath()
-        data = Data1D(x=qdata, y=iqdata)
-        data.filename = output_path.split('\\')[-1]
 
         if self.run is None:
@@ -148,8 +187,14 @@
         }
 
+        frame_data = []
+        for i in frames:
+            data = Data1D(x=qdata, y=iqdata[i])
+            frame_data.append(data)
+        # Only need to set metadata on first Data1D object
+        frame_data[0].filename = output_path.split('\\')[-1]
         for key, value in metadata.iteritems():
-            setattr(data, key, value)
-
-        self.convert_to_cansas(data, output_path)
+            setattr(frame_data[0], key, value)
+
+        self.convert_to_cansas(frame_data, output_path)
         wx.PostEvent(self.parent.manager.parent,
             StatusEvent(status="Conversion completed."))
Index: src/sas/sasgui/perspectives/file_converter/frame_select_dialog.py
===================================================================
--- src/sas/sasgui/perspectives/file_converter/frame_select_dialog.py	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
+++ src/sas/sasgui/perspectives/file_converter/frame_select_dialog.py	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
@@ -0,0 +1,46 @@
+import wx
+
+class FrameSelectDialog(wx.Dialog):
+
+    def __init__(self, n_frames):
+        wx.Dialog.__init__(self, None, title="Select Frames")
+
+        sizer = wx.GridBagSizer(10, 10)
+
+        y = 0
+        instructions = ("The file you've selected has {} frames. "
+            "Please select a subset of frames to convert to CanSAS "
+            "format").format(n_frames)
+        instructions_label = wx.StaticText(self, -1, instructions)
+        instructions_label.Wrap(self.GetSize().width - 20)
+        sizer.Add(instructions_label, (y,0), (1,2), wx.ALL, 5)
+        y += 1
+
+        first_label = wx.StaticText(self, -1, "First Frame (0-{}): ".format(n_frames-1))
+        sizer.Add(first_label, (y,0), (1,1), wx.ALL, 5)
+
+        self.first_input = wx.TextCtrl(self, -1)
+        sizer.Add(self.first_input, (y,1), (1,1))
+        y += 1
+
+        last_label = wx.StaticText(self, -1, "Last Frame (0-{}): ".format(n_frames-1))
+        sizer.Add(last_label, (y,0), (1,1), wx.ALL, 5)
+
+        self.last_input = wx.TextCtrl(self, -1)
+        sizer.Add(self.last_input, (y,1), (1,1))
+        y += 1
+
+        increment_label = wx.StaticText(self, -1, "Increment: ")
+        sizer.Add(increment_label, (y,0), (1,1), wx.ALL, 5)
+
+        self.increment_input = wx.TextCtrl(self, -1)
+        sizer.Add(self.increment_input, (y,1), (1,1))
+        y += 1
+
+        done_btn = wx.Button(self, wx.ID_OK)
+        sizer.Add(done_btn, (y,0), (1,1), wx.LEFT | wx.TOP | wx.BOTTOM, 15)
+
+        cancel_btn = wx.Button(self, wx.ID_CANCEL)
+        sizer.Add(cancel_btn, (y,1), (1,1), wx.ALL, 15)
+
+        self.SetSizer(sizer)
Index: src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst
===================================================================
--- src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst	(revision 13b9a637f5d04c489ef20096abbe2b6ad7a52ed9)
+++ src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
@@ -14,7 +14,7 @@
 *   Single column ASCII data, with lines that end with a digit, comma or
     semi-colon.
-*   `BSL formatted
+*   `BSL/OTOKO formatted
     <http://www.diamond.ac.uk/Beamlines/Soft-Condensed-Matter/small-angle/
-    SAXS-Software/CCP13/BSL.html>`_ data files
+    SAXS-Software/CCP13/BSL.html>`_ data files.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -23,7 +23,15 @@
 --------------
 
-1) Select the files containing your Q-Axis and Intensity data
+1) Select the files containing your Q-Axis and Intensity-Axis data
 2) Chose whether the files are in ASCII or BSL format
 3) Chose where you would like to save the converted XML file
 4) Optionally, input some metadata such as sample size, detector name, etc
 5) Click *Convert* to save the converted file to disk
+
+**Note**: If a BSL/OTOKO file with multiple frames is selected for the
+intensity-axis file, a dialog will appear asking which frames you would like
+converted. You may enter a start frame, end frame & increment, and all frames
+in that subset will be converted. For example: entering 0, 50 and 10 for the
+first frame, last frame, and increment respectively will convert frames 0, 10,
+20, 30, 40 & 50. To convert a single frame, enter the same value for first
+frame & last frame, and 1 as the increment.
