diff --git a/README b/README
index bad513a64641ac58385710e420cc8029d52b2e5b..510968837cbe1843842e5d84208f39e6f5b7ddfb 100644
--- a/README
+++ b/README
@@ -37,7 +37,7 @@ For information on how to get Artemis see this web page:
 
 COPYRIGHT
 
-Copyright (C) 1998-2011  Genome Research Limited
+Copyright (C) 1998-2013  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
diff --git a/etc/versions b/etc/versions
index 564964bc2e488b2a09c028c2b85628d9be4f72f7..7a91390aebd7492ab4f200248fb9336d18cec1dd 100644
--- a/etc/versions
+++ b/etc/versions
@@ -1,4 +1,4 @@
-Artemis Release 14.2.3
-ACT Release 11.2.3
+Artemis Release 14.2.4
+ACT Release 11.2.4
 DNAPlotter Release 1.9
 BamView 1.2.7
diff --git a/uk/ac/sanger/artemis/FeatureSegmentVector.java b/uk/ac/sanger/artemis/FeatureSegmentVector.java
index 68765ea951d3978b9cfa34dc657b5de1c9c4f46f..d360cc5da0c8e7e7c60a5616413eb3acb3684209 100644
--- a/uk/ac/sanger/artemis/FeatureSegmentVector.java
+++ b/uk/ac/sanger/artemis/FeatureSegmentVector.java
@@ -25,6 +25,9 @@
 
 package uk.ac.sanger.artemis;
 
+import java.util.Collections;
+import java.util.Comparator;
+
 import uk.ac.sanger.artemis.util.FastVector;
 
 /**
@@ -36,6 +39,12 @@ import uk.ac.sanger.artemis.util.FastVector;
  **/
 
 public class FeatureSegmentVector {
+  
+  /**
+   *  Storage for FeatureSegment objects.
+   */
+  private FastVector vector = new FastVector ();
+  
   /**
    *  Create a new vector of FeatureSegment objects.
    **/
@@ -146,9 +155,17 @@ public class FeatureSegmentVector {
     return_vector.vector = (FastVector) vector.clone ();
     return return_vector;
   }
+  
+  public void sortByPosition() {
+    Collections.sort(vector, new PositionComparator());
+  }
+}
 
-  /**
-   *  Storage for FeatureSegment objects.
-   */
-  private FastVector vector = new FastVector ();
+class PositionComparator implements Comparator<FeatureSegment> {
+  public int compare(FeatureSegment s1, FeatureSegment s2) {
+    if(s1.getStart().getPosition() < s2.getStart().getPosition())
+      return -1;
+    else
+      return 1;
+  } 
 }
diff --git a/uk/ac/sanger/artemis/components/FeatureBaseViewer.java b/uk/ac/sanger/artemis/components/FeatureBaseViewer.java
index 33d058de29a7455921d1d74f1e592231eca55384..5e08129f5ffcf5ad71f509f2a2da25d987c16a9f 100644
--- a/uk/ac/sanger/artemis/components/FeatureBaseViewer.java
+++ b/uk/ac/sanger/artemis/components/FeatureBaseViewer.java
@@ -25,16 +25,16 @@
 
 package uk.ac.sanger.artemis.components;
 
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
 import uk.ac.sanger.artemis.*;
-import java.awt.event.*;
 
 /**
- *  A component for viewing the bases of a feature.  Once created this
+ *  A component for viewing the bases of a feature. Once created this
  *  component listens for FeatureChange events to keep the the sequence up to
  *  date.
- *
  *  @author Kim Rutherford
- *  @version $Id: FeatureBaseViewer.java,v 1.2 2008-12-16 11:46:15 tjc Exp $
  **/
 
 public class FeatureBaseViewer
@@ -49,6 +49,8 @@ public class FeatureBaseViewer
   /** The Entry that contains the Feature this object is displaying.  */
   private Entry entry;
   
+  private FeatureSegmentVector segments;
+  
   /**
    *  Create a new FeatureBaseViewer component to display the bases of the
    *  given Feature.
@@ -58,10 +60,12 @@ public class FeatureBaseViewer
    *    sequence).
    **/
   public FeatureBaseViewer (final Feature feature,
-                            final boolean include_numbers) 
+                            final boolean include_numbers,
+                            final FeatureSegmentVector segments) 
   {
     this.feature = feature;
     this.entry = feature.getEntry ();
+    this.segments = segments;
 
     sequence_viewer =
       new SequenceViewer ("Feature base viewer for feature:" +
@@ -126,26 +130,33 @@ public class FeatureBaseViewer
    **/
   private void redisplay () 
   {
-    final StringBuffer header_buffer = new StringBuffer();
-
-    header_buffer.append(getFeature().getSystematicName());
-    header_buffer.append(" ");
-    header_buffer.append(getFeature().getIDString());
-    header_buffer.append(" ");
-
     final String product = getFeature().getProductString();
-
-    if(product == null) 
-      header_buffer.append("undefined product");
-    else 
-      header_buffer.append(product);
-    
-    header_buffer.append(" ").append(getFeature().getWriteRange());
+    final StringBuilder hdr = new StringBuilder();
+    hdr.append(getFeature().getSystematicName()).append(" ");
+    hdr.append(getFeature().getIDString()).append(" ");
+    hdr.append(product == null ? "undefined product" : product);
     
-    final String comment = ">" + header_buffer.toString();
-      
-    final String bases = getFeature ().getBases ().toUpperCase ();
-    sequence_viewer.setSequence (comment, bases);
+    final String bases;
+    if(segments != null)  // display just for selected segments
+    {
+      final StringBuilder buffer = new StringBuilder();
+      segments.sortByPosition();
+      for(int i = 0; i < segments.size(); ++i) 
+      {
+        final FeatureSegment segment = segments.elementAt(i);
+        buffer.append(segment.getBases());
+        hdr.append(i == 0 ? " " : ",").append(segment.getRawRange().toString());
+      }
+      hdr.append(getFeature ().isForwardFeature() ? " forward" : " reverse");
+      bases = buffer.toString();
+    }
+    else
+    {
+      hdr.append(" ").append(getFeature().getWriteRange());
+      bases = getFeature ().getBases ();
+    }
+
+    sequence_viewer.setSequence (">" + hdr.toString(), bases.toUpperCase ());
   }
 
   /**
diff --git a/uk/ac/sanger/artemis/components/MultiComparator.java b/uk/ac/sanger/artemis/components/MultiComparator.java
index 06a393fb88061a2b83333f2d734681cb74525b34..c412fd8e69ce82af1b2d1edd540a5646b1c51860 100644
--- a/uk/ac/sanger/artemis/components/MultiComparator.java
+++ b/uk/ac/sanger/artemis/components/MultiComparator.java
@@ -301,7 +301,7 @@ public class MultiComparator extends JFrame
       if(i < getAlignmentViewerArray().length) 
       {
         c.fill = GridBagConstraints.BOTH;
-        c.weighty = 1;
+        c.weighty = 0.5;
         getContentPane().add(getAlignmentViewerArray()[i], c);
       }
     }
diff --git a/uk/ac/sanger/artemis/components/StickyFileChooser.java b/uk/ac/sanger/artemis/components/StickyFileChooser.java
index 96314b5102f7fc55830626477e5637756b33d737..caf1e98c29f506b74d3ddbf061b93fcc67b79cb0 100644
--- a/uk/ac/sanger/artemis/components/StickyFileChooser.java
+++ b/uk/ac/sanger/artemis/components/StickyFileChooser.java
@@ -26,21 +26,18 @@
 package uk.ac.sanger.artemis.components;
 
 import uk.ac.sanger.artemis.Options;
-
 import java.io.File;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 
 /**
  *  A JFileChooser that remembers which directory it is in for next time.
- *
- *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: StickyFileChooser.java,v 1.1 2004-06-09 09:47:49 tjc Exp $
+ *  @author Kim Rutherford
  **/
 
 public class StickyFileChooser extends JFileChooser 
 {
-
+  private static final long serialVersionUID = 1L;
   /**
    *  Used to remember the directory the JFileChooser was in when the user
    *  pressed OK.  This is used as the starting directory next time.
diff --git a/uk/ac/sanger/artemis/components/ViewMenu.java b/uk/ac/sanger/artemis/components/ViewMenu.java
index 24e934b54a80ef827bcb43e7660653fb838ac7b8..d86c8114b0f4461b1c85f87b8282bfdb117f653f 100644
--- a/uk/ac/sanger/artemis/components/ViewMenu.java
+++ b/uk/ac/sanger/artemis/components/ViewMenu.java
@@ -143,26 +143,42 @@ public class ViewMenu extends SelectionMenu
       }
     });
 
-    final JMenuItem view_bases_item = new JMenuItem("Bases Of Selection");
+    final JMenu view_bases = new JMenu("Bases");
+    final JMenuItem view_bases_item = new JMenuItem("Of Selection");
     view_bases_item.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent event) 
       {
-        viewSelectedBases(true);
+        viewSelectedBases(true, false);
       }
     });
+    view_bases.add(view_bases_item);
 
     final JMenuItem view_bases_as_fasta_item =
-      new JMenuItem("Bases Of Selection As FASTA");
+      new JMenuItem("Of Selection As FASTA");
     view_bases_as_fasta_item.addActionListener(new ActionListener() 
     {
       public void actionPerformed(ActionEvent event) 
       {
-        viewSelectedBases(false);
+        viewSelectedBases(false, false);
       }
     });
+    view_bases.add(view_bases_as_fasta_item);
+    view_bases.addSeparator();
 
-    final JMenuItem view_aa_item = new JMenuItem("Amino Acids Of Selection");
+    final JMenuItem view_exon_bases =
+        new JMenuItem("Of Selected Exons As FASTA");
+    view_exon_bases.addActionListener(new ActionListener() 
+    {
+      public void actionPerformed(ActionEvent event) 
+      {
+        viewSelectedBases(false, true);
+      }
+    });
+    view_bases.add(view_exon_bases);
+
+    final JMenu view_aa = new JMenu("Amino Acids");
+    final JMenuItem view_aa_item = new JMenuItem("Of Selection");
     view_aa_item.addActionListener(new ActionListener() 
     {
       public void actionPerformed(ActionEvent event) 
@@ -170,9 +186,10 @@ public class ViewMenu extends SelectionMenu
         viewSelectedAminoAcids(true);
       }
     });
+    view_aa.add(view_aa_item);
 
     final JMenuItem view_aa_as_fasta_item =
-      new JMenuItem("Amino Acids Of Selection As FASTA");
+      new JMenuItem("Of Selection As FASTA");
     view_aa_as_fasta_item.addActionListener(new ActionListener() 
     {
       public void actionPerformed(ActionEvent event) 
@@ -180,6 +197,7 @@ public class ViewMenu extends SelectionMenu
         viewSelectedAminoAcids(false);
       }
     });
+    view_aa.add(view_aa_as_fasta_item);
 
     final JMenuItem overview_item = new JMenuItem("Overview");
     overview_item.setAccelerator(OVERVIEW_KEY);
@@ -554,10 +572,8 @@ public class ViewMenu extends SelectionMenu
     add(forward_overview_item);
     add(reverse_overview_item);
     addSeparator();
-    add(view_bases_item);
-    add(view_bases_as_fasta_item);
-    add(view_aa_item);
-    add(view_aa_as_fasta_item);
+    add(view_bases);
+    add(view_aa);
     addSeparator();
     add(feature_info_item);
     add(plot_features_item);
@@ -1712,32 +1728,36 @@ public class ViewMenu extends SelectionMenu
    *    (every second line of the display will be numbers rather than
    *    sequence).
    **/
-  private void viewSelectedBases (final boolean include_numbers) {
+  private void viewSelectedBases (final boolean include_numbers, final boolean selectedExonsOnly) {
     if (getSelection ().isEmpty ()) {
       new MessageDialog (getParentFrame (), "Nothing selected");
       return;
     }
 
-    final MarkerRange range = selection.getMarkerRange ();
+    if (selection.getMarkerRange () == null) {
+      final FeatureVector fs = getSelection ().getAllFeatures ();
 
-    if (range == null) {
-      final FeatureVector features_to_view = getSelection ().getAllFeatures ();
-
-      if (features_to_view.size () > MAXIMUM_SELECTED_FEATURES) {
-        new MessageDialog (getParentFrame (),
-                           "warning: only viewing bases for " +
-                           "the first " + MAXIMUM_SELECTED_FEATURES +
-                           " selected features");
+      if(selectedExonsOnly)
+      {
+        if (fs.size () > 1) 
+          new MessageDialog (getParentFrame (),
+               "warning: only viewing bases for the selected exons of one feature");
+        new FeatureBaseViewer (fs.elementAt(0), include_numbers, 
+            getSelection ().getSelectedSegments());
       }
-
-      for (int i = 0 ;
-           i < features_to_view.size () && i < MAXIMUM_SELECTED_FEATURES ;
-           ++i) {
-        final Feature this_feature = features_to_view.elementAt (i);
-
-        new FeatureBaseViewer (this_feature, include_numbers);
+      else
+      {
+        if (fs.size () > MAXIMUM_SELECTED_FEATURES) 
+          new MessageDialog (getParentFrame (),
+               "warning: only viewing bases for " +
+               "the first " + MAXIMUM_SELECTED_FEATURES +
+               " selected features");
+        for (int i = 0; i < fs.size () && i < MAXIMUM_SELECTED_FEATURES; ++i)
+          new FeatureBaseViewer (fs.elementAt (i), include_numbers, null);
       }
-    } else {
+    } 
+    else 
+    {
       final SequenceViewer sequence_viewer =
         new SequenceViewer ("Selected bases", include_numbers);
 
diff --git a/uk/ac/sanger/artemis/components/alignment/BamFrame.java b/uk/ac/sanger/artemis/components/alignment/BamFrame.java
index 394836007d8781c4cfe48d5a876a9fc592cd1856..8c23edc383a6460e3f8a7680a35257c2564d7e97 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamFrame.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamFrame.java
@@ -23,7 +23,7 @@ import javax.swing.JOptionPane;
         // methods we wish to
         // use as delegates for various com.apple.eawt.ApplicationListener
         // methods
-        Class bamClass = Class.forName("uk.ac.sanger.artemis.components.alignment.BamFrame");
+        Class<?> bamClass = Class.forName("uk.ac.sanger.artemis.components.alignment.BamFrame");
         BamOSXAdapter.setQuitHandler(this, bamClass.getDeclaredMethod(
             "exitApp", (Class[]) null));
         BamOSXAdapter.setAboutHandler(this, bamClass.getDeclaredMethod("about",
diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java
index b576aa4a32c05179e9a8d6f73af27f8b381a5297..93193d7684e69831734b6f8acce3234e82eb1dde 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamView.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamView.java
@@ -2382,7 +2382,7 @@ public class BamView extends JPanel
    * @param c
    * @return
    */
-  protected ImageIcon getImageIcon(Color c)
+  private ImageIcon getImageIcon(Color c)
   {
     BufferedImage image = (BufferedImage)this.createImage(10, 10);
     Graphics2D g2 = image.createGraphics();
diff --git a/uk/ac/sanger/artemis/components/alignment/GroupBamFrame.java b/uk/ac/sanger/artemis/components/alignment/GroupBamFrame.java
index ee720fca2e79606505f59dc3b090db93c605fc19..ebf7c558a9591b70dcd66c3c5d953ed9661c408e 100644
--- a/uk/ac/sanger/artemis/components/alignment/GroupBamFrame.java
+++ b/uk/ac/sanger/artemis/components/alignment/GroupBamFrame.java
@@ -180,13 +180,9 @@ class GroupBamFrame extends JFrame
         c.gridy += 1;
         c.gridx = 0;
         bamPanel.add(new JLabel(bam), c);
-        
-        Color col = bamView.getColorByJCheckBoxMenuItem(cbBam);
-        if(col == null)
-          col = Color.BLACK;
-        
+
         c.gridx = 1;
-        bamPanel.add(new JLabel(bamView.getImageIcon(col)), c);
+        bamPanel.add(new JLabel(cbBam.getIcon()), c);
 
         c.gridx = 2;
         JComboBox groupCombo = new JComboBox( groups );
diff --git a/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java b/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java
index f1bef0a0ca7c4962f6bc6a70a5b80d7c9ff26243..17861ff9661f76b1165671bfc6f2a98c3e558f24 100644
--- a/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java
+++ b/uk/ac/sanger/artemis/components/alignment/ReadCountDialog.java
@@ -140,7 +140,7 @@ import uk.ac.sanger.artemis.util.StringVector;
         qNames = new StringVector();
         Object objs[] = systematicListSelectionPanel.getResultArray();
         for(Object o: objs)
-          qNames.add(o);
+          qNames.add((String)o);
       }
       
       return pickName(f, qNames);
diff --git a/uk/ac/sanger/artemis/components/variant/VCFview.java b/uk/ac/sanger/artemis/components/variant/VCFview.java
index 83220e3e34ef54f64c046ec2346e1a9efd598f8c..31a60edc86b723ecefc2f6fdbfbebe237fb4abf0 100644
--- a/uk/ac/sanger/artemis/components/variant/VCFview.java
+++ b/uk/ac/sanger/artemis/components/variant/VCFview.java
@@ -158,7 +158,7 @@ public class VCFview extends JPanel
   private int dragStart = -1;
   private JPopupMenu popup;
   private JMenu vcfFilesMenu = new JMenu("VCF files");
-  private int LINE_HEIGHT = 15;
+  private int LINE_HEIGHT = 14;
   
   protected boolean showSynonymous = true;
   protected boolean showNonSynonymous = true;
@@ -262,7 +262,6 @@ public class VCFview extends JPanel
     JPanel bottomPanel = new JPanel(new BorderLayout());
     graphPanel = new GraphPanel(this);
     graphPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.gray));
-    graphPanel.setPreferredSize(new Dimension(900, 100));
     graphPanel.setVisible(false);
     
     bottomPanel.add(graphPanel, BorderLayout.CENTER);
@@ -342,8 +341,31 @@ public class VCFview extends JPanel
     for(int i=0; i<vcfFiles.size(); i++)
       addToViewMenu(i);
     
-    popup.addSeparator();
+    final JMenu lineHgt = new JMenu("Row Height");
+    popup.add(lineHgt);
+    final ButtonGroup groupLnHgt = new ButtonGroup();
+    for(int i=8; i<37; i+=2)
+    {
+      final int ii = i;
+      final JCheckBoxMenuItem hgtMenu = new JCheckBoxMenuItem(
+          Integer.toString(i), (i == LINE_HEIGHT));
+      groupLnHgt.add(hgtMenu);
+      hgtMenu.addActionListener(new ActionListener()
+      {
+        public void actionPerformed(ActionEvent e)
+        {
+          if(hgtMenu.isSelected())
+          {
+            LINE_HEIGHT = ii;
+            setDisplay();
+            revalidate();
+          }
+        }
+      });
+      lineHgt.add(hgtMenu);
+    }
     
+    popup.addSeparator();
 
     markNewStops.addActionListener(new ActionListener()
     {
@@ -580,7 +602,7 @@ public class VCFview extends JPanel
         graphDP.setSelected(false);
         graphSim.setSelected(false);
         graphPanel.setType(0);
-        graphPanel.repaint();
+        setGraphSize();
       }
     });
     
@@ -592,7 +614,7 @@ public class VCFview extends JPanel
         graphSNP.setSelected(false);
         graphSim.setSelected(false);
         graphPanel.setType(1);
-        graphPanel.repaint();
+        setGraphSize();
       }
     });
     
@@ -604,7 +626,7 @@ public class VCFview extends JPanel
         graphSNP.setSelected(false);
         graphDP.setSelected(false);
         graphPanel.setType(2);
-        graphPanel.repaint();
+        setGraphSize();
       }
     });
     
@@ -643,6 +665,19 @@ public class VCFview extends JPanel
     popup.add(labels);
   }
   
+  private void setGraphSize()
+  {
+    repaint();
+    if(graphPanel.isVisible())
+      graphPanel.setPreferredSize(new Dimension(900, 70));
+    else
+      graphPanel.setPreferredSize(new Dimension(900, 1));
+
+    vcfPanel.setPreferredSize(new Dimension(900, 
+        graphPanel.getPreferredSize().height+getPreferredSize().height));
+    vcfPanel.revalidate();
+  }
+  
   private void createTopPanel(final JFrame frame, final EntryEdit entry_edit)
   {
     final JComponent topPanel;
diff --git a/uk/ac/sanger/artemis/io/GFFStreamFeature.java b/uk/ac/sanger/artemis/io/GFFStreamFeature.java
index ce33eed6698adcaa6cf2897f2692b32fc9af8f19..162d45f94ae416b43f1538d0d6b5973bd7fae3dc 100644
--- a/uk/ac/sanger/artemis/io/GFFStreamFeature.java
+++ b/uk/ac/sanger/artemis/io/GFFStreamFeature.java
@@ -1187,7 +1187,7 @@ public class GFFStreamFeature extends SimpleDocumentFeature
             new StringTokenizer((String)att_values.get(0), ",");
         StringVector str_values = new StringVector();
         while(stok.hasMoreTokens())
-          str_values.add(stok.nextElement());
+          str_values.add(stok.nextToken());
 
         att_values = str_values;
       }
diff --git a/uk/ac/sanger/artemis/plot/UserDataAlgorithm.java b/uk/ac/sanger/artemis/plot/UserDataAlgorithm.java
index 0a69f718add3b0acc61c65572245071d91b9a580..a4e6fc83ee7ab1740b56d16eecc92a77a4a68e89 100644
--- a/uk/ac/sanger/artemis/plot/UserDataAlgorithm.java
+++ b/uk/ac/sanger/artemis/plot/UserDataAlgorithm.java
@@ -953,13 +953,13 @@ public class UserDataAlgorithm extends BaseAlgorithm
             base = Integer.parseInt((String)parts.get(getStartColumn()-1)) - start;
           else
           {
-            int b = Integer.parseInt((String)parts.get(getStartColumn()-1));
-            int e = Integer.parseInt((String)parts.get(getEndColumn()-1));
+            int b = Integer.parseInt(parts.get(getStartColumn()-1));
+            int e = Integer.parseInt(parts.get(getEndColumn()-1));
             base = b + ((b - e)/2) - start;
           }
           for(int i=0; i<rvalues[base].length; i++)
           {
-            float val = Float.parseFloat( (String) parts.get(i+getEndColumn()) );
+            float val = Float.parseFloat( parts.get(i+getEndColumn()) );
             if(logTransform)
               val = (float) Math.log(val+1);
 
diff --git a/uk/ac/sanger/artemis/util/StringVector.java b/uk/ac/sanger/artemis/util/StringVector.java
index 6baecc33ec338f263ca6d01ee44ab6694088d61b..95f560d579a90ea74c2f1060d6a6e1bb08440016 100644
--- a/uk/ac/sanger/artemis/util/StringVector.java
+++ b/uk/ac/sanger/artemis/util/StringVector.java
@@ -36,8 +36,10 @@ import java.util.Comparator;
  *  @version $Id: StringVector.java,v 1.5 2005-10-13 12:06:12 tjc Exp $
  **/
 
-public class StringVector extends Vector
+public class StringVector extends Vector<String>
 {
+  private static final long serialVersionUID = 1L;
+
   /**
    *  Create a new vector of String objects.
    **/
@@ -85,10 +87,10 @@ public class StringVector extends Vector
    *  package.
    */
   public void sort()
-  {
-    final Comparator comparator = new Comparator()
+  { 
+    final Comparator<String> comparator = new Comparator<String>()
     {
-      public int compare(Object fst, Object snd) 
+      public int compare(String fst, String snd) 
       {
         if(fst == null) 
         {
@@ -102,7 +104,7 @@ public class StringVector extends Vector
           if(snd == null)
             return 1;
         }
-        return ((String)fst).compareTo((String) snd);
+        return fst.compareTo(snd);
       }
     };
 
@@ -122,61 +124,59 @@ public class StringVector extends Vector
    *  splitting using the given characters.  If the argument String is zero
    *  length or it consists only of the characters used to split, the return
    *  vector will be zero length.
-   *  @param keep_zero_char_tokens If true then zero width tokens will be
-   *    returned.  eg. when spliting on tabs if this parameter is true then
+   *  @param keep_zero_char_toks If true then zero width tokens will be
+   *    returned.  eg. when splitting on tabs if this parameter is true then
    *    splitting this "\t\tfoo" will return "" and "foo".  If this flag is
    *    false then the split_characters will be treated as a block (and "foo"
    *    would be returned in the example.
    **/
   public static StringVector getStrings(final String argument,
-                                        String split_characters,
-                                        final boolean keep_zero_char_tokens) 
+                                        final String delim,
+                                        final boolean keep_zero_char_toks) 
   {
-    final StringVector return_vector = new StringVector();
+    final StringVector strVector = new StringVector();
 
-    String value;
-    String last_value = null;
+    String tok;
+    String lastTok = null;
+    int idx1 = 0;
+    int idx2;
+    final int argLen = argument.length();
 
-    int ind1 = 0;
-    int ind2;
-    int argLen  = argument.length();
-
-    while(ind1 < argLen)
+    while(idx1 < argLen)
     {
-      ind2 = argument.indexOf(split_characters,ind1);
-      if(ind2 == ind1)
+      idx2 = argument.indexOf(delim,idx1);
+      if(idx2 == idx1)
       {
-        ind1++;
+        idx1++;
         continue;
       }
 
-      if(ind2 < 0)
-        ind2 = argLen;
+      if(idx2 < 0)
+        idx2 = argLen;
  
-      value = argument.substring(ind1,ind2);
-      ind1 = ind2+1;
+      tok = argument.substring(idx1,idx2);
+      idx1 = idx2+1;
 
-      if(value.length() == 1 &&
-         split_characters.indexOf(value.charAt(0)) != -1) 
+      if(tok.length() == 1 &&
+          delim.indexOf(tok.charAt(0)) != -1) 
       {
         // ignore the split characters
-
-        if(keep_zero_char_tokens &&
-           (last_value == null ||
-            last_value != null && last_value.length () == 1 &&
-            split_characters.indexOf (last_value) != -1)) 
+        if(keep_zero_char_toks &&
+           (lastTok == null ||
+            lastTok != null && lastTok.length () == 1 &&
+            delim.indexOf (lastTok) != -1)) 
         {
-          // we need to add a space because of two split_characters in a row
-          return_vector.add("");
+          // add a space because of two split_characters in a row
+          strVector.add("");
         }
       } 
       else
-        return_vector.add(value);
+        strVector.add(tok);
 
-      last_value = value;
+      lastTok = tok;
     }
 
-    return return_vector;
+    return strVector;
   }
 
   /**
@@ -207,13 +207,19 @@ public class StringVector extends Vector
   {
     String argument = "a a g g g c a c g t c g c a t c g a c t c";
     long startTime = System.currentTimeMillis();
-
     for(int i=0; i<10000000; i++)
       getStrings(argument, " ", true);
 
-    long endTime = System.currentTimeMillis();
+    System.out.println("TIME TAKEN "+  Long.toString(System.currentTimeMillis()-startTime));
 
-    System.out.println("TIME TAKEN "+  Long.toString(endTime-startTime));
+    startTime = System.currentTimeMillis();
+    for(int i=0; i<10000000; i++)
+    {
+      java.util.StringTokenizer st = new java.util.StringTokenizer(argument, " ", true);
+      while(st.hasMoreTokens())
+        st.nextToken();
+    }
+    System.out.println("TIME TAKEN "+  Long.toString(System.currentTimeMillis()-startTime));
   }
 
 }
diff --git a/uk/ac/sanger/artemis/util/TextDocument.java b/uk/ac/sanger/artemis/util/TextDocument.java
index 8955b44d75ca4af22efbe631980e9fa498a17482..2ceee5bab7e4af175de2e9e3bf1c1ab91f411d18 100644
--- a/uk/ac/sanger/artemis/util/TextDocument.java
+++ b/uk/ac/sanger/artemis/util/TextDocument.java
@@ -24,25 +24,28 @@
 
 package uk.ac.sanger.artemis.util;
 
-import java.io.*;
 import javax.swing.JOptionPane;
-import uk.ac.sanger.artemis.components.SwingWorker;
 import java.awt.Toolkit;
-import java.awt.datatransfer.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 
 /**
  *  Objects of this class are Documents created from a file.
- *
  **/
-
 public class TextDocument extends Document 
 {
   /**
-  *
   *  Create a new TextDocument from a String.
   *  @param location This should be a file or directory name. 
   *  @param remote_file File on server
-  *
   **/
   public TextDocument() 
   {
@@ -169,35 +172,4 @@ public class TextDocument extends Document
       return file_output_stream;
   }
 
-  /**
-  *
-  * Save the entry back to the ssh server
-  *
-  */
-/*
-  public void saveEntry(final File local_file)
-  {
-    SwingWorker putWorker = new SwingWorker()
-    {
-      FileTransferProgressMonitor monitor;
-      public Object construct()
-      {
-        monitor = new FileTransferProgressMonitor(null);
-        FTProgress progress = monitor.add(local_file.getName());
-
-        getRemoteFileNode().put(local_file, progress);
-        monitor.close();
-        return null;
-      }
-
-      public void finished()
-      {
-        if(monitor != null)
-          monitor.close();
-      }
-    };
-    putWorker.start();
-  }
-*/
-
 }