Index: src/sas/sasgui/perspectives/file_converter/cansas_writer.py
===================================================================
--- src/sas/sasgui/perspectives/file_converter/cansas_writer.py	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
+++ src/sas/sasgui/perspectives/file_converter/cansas_writer.py	(revision 94f451863e884d382ed10e45ae3f7c02523e1346)
@@ -55,5 +55,6 @@
         self._write_run_names(datainfo, entry_node)
         # Add Data info to SASEntry
-        self._write_data(frame_data, entry_node)
+        for data_info in frame_data:
+            self._write_data(data_info, entry_node)
         # Transmission Spectrum Info
         self._write_trans_spectrum(datainfo, entry_node)
@@ -77,5 +78,5 @@
         return doc, entry_node
 
-    def _write_data(self, frame_data, entry_node):
+    def _write_data(self, datainfo, entry_node):
         """
         Writes the I and Q data to the XML file
@@ -84,26 +85,25 @@
         :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)
+        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],
+        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 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})
+            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 eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
+++ src/sas/sasgui/perspectives/file_converter/converter_panel.py	(revision 94f451863e884d382ed10e45ae3f7c02523e1346)
@@ -73,11 +73,20 @@
         self.Layout()
 
-    def convert_to_cansas(self, frame_data, filename):
+    def convert_to_cansas(self, frame_data, filename, single_file):
         reader = CansasWriter()
         entry_attrs = None
         if self.run_name is not None:
             entry_attrs = { 'name': self.run_name }
-        reader.write(filename, frame_data,
-            sasentry_attrs=entry_attrs)
+        if single_file:
+            reader.write(filename, frame_data,
+                sasentry_attrs=entry_attrs)
+        else:
+            # strip extension from filename
+            ext = "." + filename.split('.')[-1]
+            name = filename.replace(ext, '')
+            for i in range(len(frame_data)):
+                f_name = "{}{}{}".format(name, i+1, ext)
+                reader.write(f_name, [frame_data[i]],
+                    sasentry_attrs=entry_attrs)
 
     def extract_data(self, filename):
@@ -111,4 +120,5 @@
         frames = None
         increment = None
+        single_file = True
         while not valid_input:
             if dlg.ShowModal() == wx.ID_OK:
@@ -118,4 +128,5 @@
                     last_frame = int(dlg.last_input.GetValue())
                     increment = int(dlg.increment_input.GetValue())
+                    single_file = dlg.single_btn.GetValue()
                     if last_frame < 0 or first_frame < 0:
                         msg = "Frame values must be positive"
@@ -136,8 +147,8 @@
                         StatusEvent(status=msg))
             else:
-                return [], 0
+                return { 'frames': [], 'inc': None, 'file': single_file }
         frames = range(first_frame, last_frame + increment,
             increment)
-        return frames, increment
+        return { 'frames': frames, 'inc': increment, 'file': single_file }
 
     def on_convert(self, event):
@@ -159,6 +170,10 @@
                 frames = [iqdata.shape[0]]
                 increment = 1
+                single_file = True
                 if frames[0] > 3:
-                    frames, increment = self.ask_frame_range(frames[0])
+                    params = self.ask_frame_range(frames[0])
+                    frames = params['frames']
+                    increment = params['inc']
+                    single_file = params['file']
                     if frames == []: return
         except Exception as ex:
@@ -191,10 +206,18 @@
             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(frame_data[0], key, value)
-
-        self.convert_to_cansas(frame_data, output_path)
+        if single_file:
+            # Only need to set metadata on first Data1D object
+            frame_data[0].filename = output_path.split('\\')[-1]
+            for key, value in metadata.iteritems():
+                setattr(frame_data[0], key, value)
+        else:
+            # Need to set metadata for all Data1D objects
+            for datainfo in frame_data:
+                datainfo.filename = output_path.split('\\')[-1]
+                for key, value in metadata.iteritems():
+                    setattr(datainfo, key, value)
+
+
+        self.convert_to_cansas(frame_data, output_path, single_file)
         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 94f451863e884d382ed10e45ae3f7c02523e1346)
@@ -13,9 +13,10 @@
             "format").format(n_frames)
         instructions_label = wx.StaticText(self, -1, instructions)
-        instructions_label.Wrap(self.GetSize().width - 20)
+        instructions_label.Wrap(self.GetSize().width - 10)
         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))
+        first_label = wx.StaticText(self, -1,
+            "First Frame (0-{}): ".format(n_frames-1))
         sizer.Add(first_label, (y,0), (1,1), wx.ALL, 5)
 
@@ -24,5 +25,6 @@
         y += 1
 
-        last_label = wx.StaticText(self, -1, "Last Frame (0-{}): ".format(n_frames-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)
 
@@ -38,9 +40,27 @@
         y += 1
 
+        export_label = wx.StaticText(self, -1, "Export each frame to:")
+        sizer.Add(export_label, (y,0), (1,1), wx.LEFT | wx.RIGHT | wx.TOP, 5)
+        y += 1
+
+        self.single_btn = wx.RadioButton(self, -1, label="The same file",
+            style=wx.RB_GROUP)
+        sizer.Add(self.single_btn, (y,0), (1,1),
+            wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
+
+        multiple_btn = wx.RadioButton(self, -1, label="Multiple files")
+        sizer.Add(multiple_btn, (y,1), (1,1),
+            wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
+        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)
+        sizer.Add(done_btn, (y,0), (1,1), wx.LEFT | wx.BOTTOM, 15)
 
         cancel_btn = wx.Button(self, wx.ID_CANCEL)
-        sizer.Add(cancel_btn, (y,1), (1,1), wx.ALL, 15)
+        sizer.Add(cancel_btn, (y,1), (1,1), wx.LEFT | wx.RIGHT | wx.BOTTOM, 15)
 
         self.SetSizer(sizer)
+
+        size = self.GetSize()
+        size.height += 35
+        self.SetSize(size)
Index: src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst
===================================================================
--- src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst	(revision eb8da5f6d46ff9952df4b0fa31b3cf63ba4e1be8)
+++ src/sas/sasgui/perspectives/file_converter/media/file_converter_help.rst	(revision 94f451863e884d382ed10e45ae3f7c02523e1346)
@@ -12,6 +12,6 @@
 The input files can be:
 
-*   Single column ASCII data, with lines that end with a digit, comma or
-    semi-colon.
+*   Single column ASCII data, with lines that end with a digit (no delimiter),
+    comma or semi-colon.
 *   `BSL/OTOKO formatted
     <http://www.diamond.ac.uk/Beamlines/Soft-Condensed-Matter/small-angle/
@@ -29,9 +29,18 @@
 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.
+Files With Multiple Frames
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+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.
+
+There is also the option to output the data as multiple frames in a single
+CanSAS file, or multiple files with one frame each. The single file option will
+produce one file with multiple `<SASdata>` elements. The multiple file option
+will output a file for each frame; each file will have one `<SASdata>` element,
+and the frame number will appended to the file name.
