diff --git a/uk/ac/sanger/artemis/components/variant/IOUtils.java b/uk/ac/sanger/artemis/components/variant/IOUtils.java
index db0b214373fd6401dfb35d487e651fdda2fafe78..b356803989492629bafcbea0c2f9dada982e3b31 100644
--- a/uk/ac/sanger/artemis/components/variant/IOUtils.java
+++ b/uk/ac/sanger/artemis/components/variant/IOUtils.java
@@ -72,7 +72,7 @@ class IOUtils
         
         VCFRecord record = VCFRecord.parse(line);
         int basePosition = record.getPos() + vcfView.getSequenceOffset(record.getChrom());
-        if( !vcfView.showVariant(record.getRef(), record.getAlt(), features, basePosition, record.getQuality()) )
+        if( !vcfView.showVariant(record, features, basePosition) )
           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 d410be34e2f359a8d3ac7ae4fa0fe3755c786feb..1b58cdc285bb7f44312e2a0a46be8abd74e9e56c 100644
--- a/uk/ac/sanger/artemis/components/variant/VCFview.java
+++ b/uk/ac/sanger/artemis/components/variant/VCFview.java
@@ -145,7 +145,6 @@ public class VCFview extends JPanel
   
   // show variants that do not overlap CDS
   private boolean showNonOverlappings = true;
-  private float MIN_QUALITY = -10;
   
   Hashtable<String, Integer> offsetLengths = null;
   private boolean concatSequences = false;
@@ -505,30 +504,16 @@ public class VCFview extends JPanel
     });
     popup.add(markNewStops);
     
-    final JMenuItem filterByQuality = new JMenuItem("Filter by quality");
-    filterByQuality.addActionListener(new ActionListener(){
+    
+    final JMenuItem byQuality = new JMenuItem("Filter ...");
+    byQuality.addActionListener(new ActionListener(){
       public void actionPerformed(ActionEvent e)
       {
-        //
-        String inputValue = JOptionPane.showInputDialog(null, 
-            "Enter a minimum quality score:", MIN_QUALITY);
-        if(inputValue == null)
-          return;
-        try
-        {
-          MIN_QUALITY = Float.parseFloat(inputValue);
-          repaint();
-        }
-        catch(NumberFormatException ex)
-        {
-          JOptionPane.showMessageDialog(null, 
-              "Number "+inputValue+" not recognised.", 
-              "Format Error", JOptionPane.ERROR_MESSAGE);
-        }
+        new VCFFilter(VCFview.this);
       }
     });
-    popup.add(filterByQuality);
-    
+    popup.add(byQuality);
+    popup.addSeparator();
     
     final JMenuItem exportVCF = new JMenuItem("Export filtered VCF");
     exportVCF.addActionListener(new ActionListener(){
@@ -920,35 +905,28 @@ public class VCFview extends JPanel
     return false;
   }
   
-  protected boolean showVariant(String ref, String variant, FeatureVector features, int basePosition, float quality)
+  protected boolean showVariant(VCFRecord record, FeatureVector features, int basePosition)
   {  
-    if(!showDeletions && isDeletion(ref, variant))
+    if(!showDeletions && isDeletion(record.getRef(), record.getAlt()))
       return false;
     
-    if(!showInsertions && isInsertion(ref, variant))
+    if(!showInsertions && isInsertion(record.getRef(), record.getAlt()))
+      return false;
+
+    if(!VCFFilter.passFilter(record))
       return false;
-    
-    try
-    {
-      if(quality < MIN_QUALITY)
-        return false;
-    }
-    catch(NumberFormatException e)
-    {
-      System.err.println(e.getMessage()); 
-    }
     
     if(!showNonOverlappings && !isOverlappingFeature(features, basePosition))
         return false;
     
     int isSyn = -1;
     if(markNewStops.isSelected() &&
-       !isDeletion(ref, variant) && 
-       !isInsertion(ref, variant) && 
-        variant.length() == 1 && 
-        ref.length() == 1)
+       !isDeletion(record.getRef(), record.getAlt()) && 
+       !isInsertion(record.getRef(), record.getAlt()) && 
+        record.getAlt().length() == 1 && 
+        record.getRef().length() == 1)
     {
-      isSyn = isSynonymous(features, basePosition, variant.toLowerCase().charAt(0));
+      isSyn = isSynonymous(features, basePosition, record.getAlt().toLowerCase().charAt(0));
       if(isSyn == 2)
         markAsNewStop = true;
       else
@@ -956,20 +934,20 @@ public class VCFview extends JPanel
     }
     
     if( (!showSynonymous || !showNonSynonymous) &&
-         !isDeletion(ref, variant) && 
-         !isInsertion(ref, variant) && 
-         variant.length() == 1 && 
-         ref.length() == 1)
+         !isDeletion(record.getRef(), record.getAlt()) && 
+         !isInsertion(record.getRef(), record.getAlt()) && 
+         record.getAlt().length() == 1 && 
+         record.getRef().length() == 1)
     {
       if(isSyn == -1)
-        isSyn = isSynonymous(features, basePosition, variant.toLowerCase().charAt(0));
+        isSyn = isSynonymous(features, basePosition, record.getAlt().toLowerCase().charAt(0));
       
       if( (!showSynonymous && isSyn == 1) ||
           (!showNonSynonymous && isSyn != 1 ) )
         return false;
     }
     
-    if(!showMultiAlleles && multiAllelePattern.matcher(variant).matches())
+    if(!showMultiAlleles && multiAllelePattern.matcher(record.getAlt()).matches())
       return false;
     
     return true;
@@ -1002,7 +980,7 @@ public class VCFview extends JPanel
     
     int basePosition = record.getPos() + getSequenceOffset(record.getChrom());
    
-    if( !showVariant(record.getRef(), record.getAlt(), features, basePosition, record.getQuality()) )
+    if( !showVariant(record, features, basePosition) )
       return;
     
     int pos[] = getScreenPosition(basePosition, pixPerBase, start, index);
@@ -1246,7 +1224,7 @@ public class VCFview extends JPanel
   {
     int basePosition = record.getPos() + getSequenceOffset(record.getChrom());
 
-    if( !showVariant(record.getRef(), record.getAlt(), features, basePosition, record.getQuality()) )
+    if( !showVariant(record, features, basePosition) )
       return;
     
     int pos[] = getScreenPosition(basePosition, pixPerBase, start, i);