diff --git a/uk/ac/sanger/artemis/components/variant/IOUtils.java b/uk/ac/sanger/artemis/components/variant/IOUtils.java
index 7a00004fe5e51c1e571f16db6380fa39705c39fa..2ebc0617c6a312d3b34e9593a1294e7061220ae2 100644
--- a/uk/ac/sanger/artemis/components/variant/IOUtils.java
+++ b/uk/ac/sanger/artemis/components/variant/IOUtils.java
@@ -67,9 +67,10 @@ class IOUtils
           writer.write(line+'\n');
           continue;
         }
-        String parts[] = VCFview.tabPattern.split(line, 0);
-        int basePosition = Integer.parseInt(parts[1]) + vcfView.getSequenceOffset(parts[0]);
-        if( !vcfView.showVariant(parts[3], parts[4], features, basePosition, parts[5]) )
+        
+        VCFRecord record = VCFRecord.parse(line);
+        int basePosition = record.pos + vcfView.getSequenceOffset(record.chrom);
+        if( !vcfView.showVariant(record.ref, record.alt, features, basePosition, record.quality) )
           continue;
         writer.write(line+'\n');
       }
diff --git a/uk/ac/sanger/artemis/components/variant/VCFview.java b/uk/ac/sanger/artemis/components/variant/VCFview.java
index 7d679d1624e14f8e916bb6e210a727ee1a9bb287..864f7f4ce64a6c84e2d6d4f026615d6f5d395a7f 100644
--- a/uk/ac/sanger/artemis/components/variant/VCFview.java
+++ b/uk/ac/sanger/artemis/components/variant/VCFview.java
@@ -26,6 +26,7 @@ package uk.ac.sanger.artemis.components.variant;
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
+import java.awt.Cursor;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.Graphics;
@@ -543,7 +544,9 @@ public class VCFview extends JPanel
     exportVCF.addActionListener(new ActionListener(){
       public void actionPerformed(ActionEvent e)
       {
+        VCFview.this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
         IOUtils.export(entryGroup, vcfFiles, VCFview.this);
+        VCFview.this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
       }
     });
     popup.add(exportVCF);
@@ -747,7 +750,7 @@ public class VCFview extends JPanel
               thisStart = 1;
             int thisEnd   = end - offset;
             
-            drawRegion(g, contigs[j]+":"+thisStart+"-"+thisEnd, i, start, pixPerBase, features); 
+            drawRegion(g, contigs[j], thisStart+"-"+thisEnd, i, start, pixPerBase, features); 
           }
         }
 
@@ -757,7 +760,7 @@ public class VCFview extends JPanel
         int thisStart = start;
         if(thisStart < 1)
           thisStart = 1;
-        drawRegion(g, chr+":"+thisStart+"-"+end, i, start, pixPerBase, features); 
+        drawRegion(g, chr, thisStart+"-"+end, i, start, pixPerBase, features); 
       }
     }
 
@@ -765,7 +768,8 @@ public class VCFview extends JPanel
       drawScale((Graphics2D)g, start, end, pixPerBase, getHeight());
   }
   
-  private void drawRegion(Graphics g, 
+  private void drawRegion(Graphics g,
+                          String chr,
                           String region,
                           int i, 
                           int start, 
@@ -773,13 +777,16 @@ public class VCFview extends JPanel
                           FeatureVector features) 
   {
     String s;
-    TabixReader.Iterator iter = tr[i].query(region); // get the iterator
+    TabixReader.Iterator iter = tr[i].query(chr+":"+region); // get the iterator
     if (iter == null)
       return;
     try
     {
       while ((s = iter.next()) != null)
-        drawVariantCall(g, s, start, i, pixPerBase, features);
+      {
+        VCFRecord vcfRecord = VCFRecord.parse(s);
+        drawVariantCall(g, vcfRecord, start, i, pixPerBase, features);
+      }
     }
     catch (IOException e)
     {
@@ -892,7 +899,7 @@ public class VCFview extends JPanel
     return false;
   }
   
-  protected boolean showVariant(String ref, String variant, FeatureVector features, int basePosition, String quality)
+  protected boolean showVariant(String ref, String variant, FeatureVector features, int basePosition, float quality)
   {  
     if(!showDeletions && isDeletion(ref, variant))
       return false;
@@ -902,7 +909,7 @@ public class VCFview extends JPanel
     
     try
     {
-      if(Float.parseFloat(quality) < MIN_QUALITY)
+      if(quality < MIN_QUALITY)
         return false;
     }
     catch(NumberFormatException e)
@@ -967,33 +974,33 @@ public class VCFview extends JPanel
   }
   
   
-  private void drawVariantCall(Graphics g, String line, int start, int index, float pixPerBase, FeatureVector features)
+  private void drawVariantCall(Graphics g, VCFRecord record, int start, int index, float pixPerBase, FeatureVector features)
   {
     //String parts[] = line.split("\\t");
-    String parts[] = tabPattern.split(line, 0);
+    //String parts[] = tabPattern.split(line, 0);
     
-    int basePosition = Integer.parseInt(parts[1]) + getSequenceOffset(parts[0]);
+    int basePosition = record.pos + getSequenceOffset(record.chrom);
    
-    if( !showVariant(parts[3], parts[4], features, basePosition, parts[5]) )
+    if( !showVariant(record.ref, record.alt, features, basePosition, record.quality) )
       return;
     
     int pos[] = getScreenPosition(basePosition, pixPerBase, start, index);
 
-    if(isDeletion(parts[3], parts[4]))
+    if(isDeletion(record.ref, record.alt))
       g.setColor(Color.gray);
-    else if(isInsertion(parts[3], parts[4]))
+    else if(isInsertion(record.ref, record.alt))
       g.setColor(Color.yellow);
-    else if(parts[4].equals("C") && parts[3].length() == 1)
+    else if(record.alt.equals("C") && record.ref.length() == 1)
       g.setColor(Color.red);
-    else if(parts[4].equals("A") && parts[3].length() == 1)
+    else if(record.alt.equals("A") && record.ref.length() == 1)
       g.setColor(Color.green);
-    else if(parts[4].equals("G") && parts[3].length() == 1)
+    else if(record.alt.equals("G") && record.ref.length() == 1)
       g.setColor(Color.blue);
-    else if(parts[4].equals("T") && parts[3].length() == 1)
+    else if(record.alt.equals("T") && record.ref.length() == 1)
       g.setColor(Color.black);
     else
     {
-      Matcher m = multiAllelePattern.matcher(parts[4]);
+      Matcher m = multiAllelePattern.matcher(record.alt);
       if(m.matches())
       {
         g.setColor(Color.orange);
@@ -1165,7 +1172,10 @@ public class VCFview extends JPanel
     { 
       String s;
       while ((s = iter.next()) != null)
-        isMouseOver(mousePoint, s, features, i, start, pixPerBase);
+      {
+        VCFRecord vcfRecord = VCFRecord.parse(s);
+        isMouseOver(mousePoint, vcfRecord, features, i, start, pixPerBase);
+      }
     }
     catch (IOException e)
     {
@@ -1174,15 +1184,14 @@ public class VCFview extends JPanel
   }
   
   private void isMouseOver(Point mousePoint, 
-                           String s, 
+                           VCFRecord record, 
                            FeatureVector features, 
                            int i, 
                            int start, float pixPerBase)
   {
-    String parts[] = tabPattern.split(s, 7);
-    int basePosition = Integer.parseInt(parts[1]) + getSequenceOffset(parts[0]);
+    int basePosition = record.pos + getSequenceOffset(record.chrom);
 
-    if( !showVariant(parts[3], parts[4], features, basePosition, parts[5]) )
+    if( !showVariant(record.ref, record.alt, features, basePosition, record.quality) )
       return;
     
     int pos[] = getScreenPosition(basePosition, pixPerBase, start, i);
@@ -1192,7 +1201,7 @@ public class VCFview extends JPanel
        mousePoint.getX() > pos[0]-3 &&
        mousePoint.getX() < pos[0]+3)
      {
-       mouseOverVCFline = s;
+       mouseOverVCFline = record.toString();
        mouseOverIndex = i;
      }
   }