diff --git a/uk/ac/sanger/artemis/components/variant/IOUtils.java b/uk/ac/sanger/artemis/components/variant/IOUtils.java
index e62ac259a4c3a97bec4d0a772fc92523fc52bcee..d88ff3093f6768c7d38eed879001326746041113 100644
--- a/uk/ac/sanger/artemis/components/variant/IOUtils.java
+++ b/uk/ac/sanger/artemis/components/variant/IOUtils.java
@@ -30,7 +30,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.Writer;
 import java.net.URL;
-import java.util.Comparator;
 import java.util.List;
 import java.util.Vector;
 
@@ -38,12 +37,7 @@ import javax.swing.Box;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
 import javax.swing.JFileChooser;
-import javax.swing.JFrame;
 import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.table.TableModel;
-import javax.swing.table.TableRowSorter;
 
 import uk.ac.sanger.artemis.Entry;
 import uk.ac.sanger.artemis.EntryGroup;
@@ -59,7 +53,6 @@ import uk.ac.sanger.artemis.components.FileViewer;
 import uk.ac.sanger.artemis.components.MessageDialog;
 import uk.ac.sanger.artemis.components.SequenceViewer;
 import uk.ac.sanger.artemis.components.StickyFileChooser;
-import uk.ac.sanger.artemis.components.variant.BCFReader.BCFReaderIterator;
 import uk.ac.sanger.artemis.io.DocumentEntry;
 import uk.ac.sanger.artemis.io.EntryInformationException;
 import uk.ac.sanger.artemis.io.Key;
@@ -635,6 +628,14 @@ class IOUtils
   protected static void countVariants(final VCFview vcfView,
                                       final FeatureVector features) throws IOException
   {
+    if(features.size () < 1)
+    {
+      JOptionPane.showMessageDialog(null, 
+          "No features selected.", 
+          "Warning", JOptionPane.WARNING_MESSAGE);
+      return;  
+    }
+    
     String[] columnNames = { 
         "VCF", "Name", "Variant", "Non-variant", "Deletion", "Insertion", "Synonymous", "Non-synonymous"};
     Vector<String> columnData = new Vector<String>();
@@ -704,26 +705,10 @@ class IOUtils
         rowData.add(thisRow);
       }
     }
-    
-    JTable variantData = new JTable(rowData, columnData);
-    TableRowSorter<TableModel> sorter = 
-      new TableRowSorter<TableModel>(variantData.getModel());
-    variantData.setRowSorter(sorter);
-    
-    Comparator<Integer> comparator = new Comparator<Integer>() {
-      public int compare(Integer i1, Integer i2) {
-          return i1.compareTo(i2);
-      }
-    };
-    
+   
+    TableViewer tab = new TableViewer(rowData, columnData, "Variant Overview");
     for(int i=2; i< columnData.size(); i++)
-      sorter.setComparator(i, comparator);
-    
-    JScrollPane jsp = new JScrollPane(variantData);
-    JFrame f = new JFrame("Variant Overview");
-    f.getContentPane().add(jsp);
-    f.pack();
-    f.setVisible(true);
+      tab.setIntegerRowSorter(i);
   }
   
   private static void count(VCFRecord record, int count[], FeatureVector features, AbstractVCFReader reader)
diff --git a/uk/ac/sanger/artemis/components/variant/TableViewer.java b/uk/ac/sanger/artemis/components/variant/TableViewer.java
new file mode 100644
index 0000000000000000000000000000000000000000..12a6b5918acc7e25ec4af63a0eb6cc553e14e488
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/variant/TableViewer.java
@@ -0,0 +1,153 @@
+/* TableViewer
+ *
+ * created: 2011
+ *
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2011 Genome Research Limited
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or(at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
+package uk.ac.sanger.artemis.components.variant;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Comparator;
+import java.util.Vector;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.table.TableModel;
+import javax.swing.table.TableRowSorter;
+
+import uk.ac.sanger.artemis.components.StickyFileChooser;
+
+
+class TableViewer extends JFrame
+{
+  private static final long serialVersionUID = 1L;
+  private Comparator<Integer> comparator = new Comparator<Integer>() 
+  {
+    public int compare(Integer i1, Integer i2) 
+    {
+        return i1.compareTo(i2);
+    }
+  };
+
+  private TableRowSorter<TableModel> sorter;
+  
+  public TableViewer(final Vector<Vector<Object>> rowData, final Vector<String> columnData, String title)
+  {
+    super(title);
+    final JTable variantData = new JTable(rowData, columnData);
+    sorter = new TableRowSorter<TableModel>(variantData.getModel());
+    variantData.setRowSorter(sorter);
+    
+    final JFrame f = new JFrame("Variant Overview");
+    final JScrollPane jsp = new JScrollPane(variantData);
+    final Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
+    jsp.setPreferredSize(new Dimension(screen.width/3, screen.height/3));
+    final JPanel overviewPane = new JPanel(new BorderLayout());
+    overviewPane.add(jsp, BorderLayout.CENTER);
+    
+    final Box xBox = Box.createHorizontalBox();
+    xBox.add(Box.createHorizontalGlue());
+    
+    final JButton save = new JButton("SAVE");
+    save.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        save(variantData, columnData);
+      }
+    });
+    xBox.add(save);
+    
+    final JButton close = new JButton("CLOSE");
+    close.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        f.dispose();
+      }
+    });
+    xBox.add(close);
+    overviewPane.add(xBox, BorderLayout.SOUTH);
+    f.getContentPane().add(overviewPane);
+    f.pack();
+    f.setVisible(true);
+  }
+  
+  public void setIntegerRowSorter(int colIndex)
+  {
+    sorter.setComparator(colIndex, comparator);
+  }
+  
+  private void save(final JTable table, final Vector<String> columnData)
+  {
+    StickyFileChooser fc = new StickyFileChooser();
+    int status = fc.showSaveDialog(TableViewer.this);
+    if(status != StickyFileChooser.APPROVE_OPTION)
+      return;
+    try
+    {
+      File f = fc.getSelectedFile();
+      if(f.exists())
+      {
+        status = JOptionPane.showConfirmDialog(TableViewer.this, 
+            f.getName()+" exists overwrite?", "Overwrite", JOptionPane.YES_NO_OPTION);
+        if(status != JOptionPane.YES_OPTION)
+          return;
+      }
+      
+      FileWriter writer = new FileWriter(fc.getSelectedFile());
+      for(String col: columnData)
+        writer.write(col+"\t");
+      writer.write("\n");
+      
+      int nrows = table.getRowCount();
+      int ncols = table.getColumnCount();
+      for(int i=0; i<nrows; i++)
+      {
+        for(int j=0; j<ncols; j++)
+        {
+          // use the sorted row index
+          int rowIndex = table.convertRowIndexToModel(i); 
+          writer.write(table.getModel().getValueAt(rowIndex, j)+"\t");
+        }
+        writer.write("\n");
+      }
+
+      writer.close();
+    }
+    catch (IOException e1)
+    {
+      JOptionPane.showMessageDialog(TableViewer.this, e1.getMessage(), 
+          "Problem Writing", JOptionPane.ERROR_MESSAGE);
+    } 
+  }
+}
\ No newline at end of file