diff --git a/uk/ac/sanger/artemis/components/variant/IOUtils.java b/uk/ac/sanger/artemis/components/variant/IOUtils.java
index 344350998bb9aad68fc9898889bfa1385cb900cd..660ab1ed599cedd9040e0682550db4d09b23195a 100644
--- a/uk/ac/sanger/artemis/components/variant/IOUtils.java
+++ b/uk/ac/sanger/artemis/components/variant/IOUtils.java
@@ -42,6 +42,7 @@ import uk.ac.sanger.artemis.FeatureSegment;
 import uk.ac.sanger.artemis.FeatureSegmentVector;
 import uk.ac.sanger.artemis.FeatureVector;
 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.Key;
@@ -150,7 +151,7 @@ class IOUtils
      // get all CDS features that do not have the /pseudo qualifier
     final FeatureVector features = getFeatures(
         new FeatureKeyQualifierPredicate(Key.CDS, "pseudo", false), entryGroup);
-    exportFasta(entryGroup, vcfReaders, chr, vcfView, vcf_v4, features); 
+    exportFasta(entryGroup, vcfReaders, chr, vcfView, vcf_v4, features, false); 
   }
 
   
@@ -159,7 +160,8 @@ class IOUtils
                                     final String chr,
                                     final VCFview vcfView,
                                     final boolean vcf_v4,
-                                    final FeatureVector features)
+                                    final FeatureVector features,
+                                    final boolean view)
   {
     String suffix = ".fasta";
     if(features.size() == 1)
@@ -169,9 +171,7 @@ class IOUtils
     {
       String vcfFileName = vcfReaders[i].getFileName();
       try
-      {
-        File filterFile = getFile(vcfFileName, vcfReaders.length, suffix);
-        FileWriter writer = new FileWriter(filterFile);
+      {        
         for (int j = 0; j < features.size(); j++)
         {
           Feature f = features.elementAt(j);
@@ -193,17 +193,28 @@ class IOUtils
             }
             buff.append(segBases);
           }
-          
+
           StringBuffer header = new StringBuffer(f.getSystematicName());
           header.append(" "+f.getIDString()+" ");
           final String product = f.getProductString();
           header.append( (product == null ? "undefined product" : product) );
           header.append(" ").append(f.getWriteRange());
 
-          writeSequence(writer, header.toString(), buff.toString()); 
+          if(view) // sequence viewer
+          {
+            SequenceViewer viewer =
+              new SequenceViewer ("Feature base viewer for feature:" + 
+                f.getIDString (), false);  
+            viewer.setSequence(">"+header.toString(), buff.toString());
+          }
+          else    // write to file
+          {
+            File filterFile = getFile(vcfFileName, vcfReaders.length, suffix);
+            FileWriter writer = new FileWriter(filterFile);
+            writeSequence(writer, header.toString(), buff.toString());
+            writer.close();
+          }
         }
-        
-        writer.close();
       }
       catch (IOException e)
       {
@@ -262,7 +273,11 @@ class IOUtils
     }
     else if(vcfRecord.getAlt().isMultiAllele())
     {
-      
+      String base = MultipleAlleleVariant.getIUBCode(vcfRecord);
+      if(base != null)
+        buff.append(base);
+      else
+        buff.append(bases.charAt(position));
     }
     else if(vcfRecord.getAlt().isNonVariant())                   // non-variant
     {
diff --git a/uk/ac/sanger/artemis/components/variant/MultipleAlleleVariant.java b/uk/ac/sanger/artemis/components/variant/MultipleAlleleVariant.java
new file mode 100644
index 0000000000000000000000000000000000000000..756eb4cdfec276e06a9e4fe3573ed73de7d55c7f
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/variant/MultipleAlleleVariant.java
@@ -0,0 +1,65 @@
+
+package uk.ac.sanger.artemis.components.variant;
+
+public class MultipleAlleleVariant
+{
+
+  private static String IUB[][] = 
+  { 
+      {"m", "a", "c"},
+      {"r", "a", "g"},
+      {"w", "a", "t"},
+      {"w", "a", "u"},
+      {"s", "c", "g"},
+      {"y", "c", "t"},
+      {"y", "c", "u"},
+      {"k", "g", "t"},
+      {"k", "g", "u"}
+  };
+  
+  /**
+   * M (A or C)
+   * R (A or G)
+   * W (A or T/U)
+   * S (C or G)
+   * Y (C or T/U)
+   * K (G or T/U)
+   * @param base
+   * @return
+   */
+  protected static String getIUBCode(VCFRecord record)
+  {
+    String alt = record.getAlt().toString();
+    String alleles[] = alt.split(",");
+    String pl;
+    if ((pl = record.getFormatValue("PL")) != null && pl.split(",").length == 3 &&
+         pl.split(",")[1].equals("0")) 
+    {
+      // include ref
+      String[] temp = new String[alleles.length+1];
+      System.arraycopy(alleles, 0, temp, 0, alleles.length);
+      alleles = temp;
+      alleles[alleles.length-1] = record.getRef();
+    }
+    
+    boolean isSNP = true;
+    for(int i=0; i<alleles.length; i++)
+    {
+      alleles[i] = alleles[i].toLowerCase();
+      if(alleles[i].length() > 1)
+        isSNP = false;
+    }
+    
+    if(isSNP && alleles.length == 2)
+    {
+      for(int i=0; i<IUB.length; i++)
+      {
+        if(IUB[i][1].equals(alleles[0]) && IUB[i][2].equals(alleles[1]) ||
+           IUB[i][1].equals(alleles[1]) && IUB[i][2].equals(alleles[0]))
+          return IUB[i][0];
+      }
+    }
+    return null;
+  }
+
+}
\ No newline at end of file