diff --git a/art b/art
old mode 100755
new mode 100644
index 87d56c82ffbfb55a1314f7fed2841df7536ddf73..4ff736b49574e9740ad346927906bc326015ea60
--- a/art
+++ b/art
@@ -89,22 +89,23 @@ SYNOPSIS
 USAGE
         $0 [options] <SEQUENCE_FILE> [+FEATURE_FILE ...]
 OPTIONS
-        SEQUENCE_FILE           An EMBL, GenBank, FASTA, or GFF3 file
-        FEATURE_FILE            An Artemis TAB file, or GFF file
-
-        -quiet                  Suppress normal info messages while running
-        -options FILE           Read a text file of options from FILE
-        -debug                  Run using the debugging JVM instead
-        -fast | -fast64         Use the FastVM (hp Tru64 UNIX) with 32/64 bit pointers
-
-        -Dblack_belt_mode=?     Keep warning messages to a minimum [true,false]
-        -Doffset=XXX            Open viewer at base position XXX [integer >= 1]
-        -Duserplot=FILE[,FILE2] Open one or more userplots
-        -Dbam=FILE[,FILE2,...]  Open one or more BAM, VCF or BCF files
-        -Dshow_forward_lines=?  Hide/show forward frame lines [true,false]
-        -Dshow_reverse_lines=?  Hide/show reverse frame lines [true,false]
-        -Dchado="h:p/d?u"       Get Artemis to open this CHADO database
-        -Dread_only             Open CHADO database read-only
+        SEQUENCE_FILE              An EMBL, GenBank, FASTA, or GFF3 file
+        FEATURE_FILE               An Artemis TAB file, or GFF file
+
+        -quiet                     Suppress normal info messages while running
+        -options FILE              Read a text file of options from FILE
+        -debug                     Run using the debugging JVM instead
+        -fast | -fast64            Use the FastVM (hp Tru64 UNIX) with 32/64 bit pointers
+
+        -Dblack_belt_mode=?        Keep warning messages to a minimum [true,false]
+        -Doffset=XXX               Open viewer at base position XXX [integer >= 1]
+        -Duserplot=FILE[,FILE2]    Open one or more userplots
+        -Dloguserplot=FILE[,FILE2] Open one or more userplots, take log(data)
+        -Dbam=FILE[,FILE2,...]     Open one or more BAM, VCF or BCF files
+        -Dshow_forward_lines=?     Hide/show forward frame lines [true,false]
+        -Dshow_reverse_lines=?     Hide/show reverse frame lines [true,false]
+        -Dchado="h:p/d?u"          Get Artemis to open this CHADO database
+        -Dread_only                Open CHADO database read-only
 EXAMPLES
         % art AJ006275.embl
         % art contigs.fa +annotation.gff +islands.tab
diff --git a/etc/versions b/etc/versions
index 32a28bca9f587e3594e167d398c06e24283c2bbe..f0b938b63103ada57b94ffb17016faa15e94e275 100644
--- a/etc/versions
+++ b/etc/versions
@@ -1,4 +1,4 @@
-Artemis Release 14.0.16
-ACT Release 11.0.16
+Artemis Release 14.0.17
+ACT Release 11.0.17
 DNAPlotter Release 1.7
 BamView 1.2.2
diff --git a/uk/ac/sanger/artemis/components/BasePlot.java b/uk/ac/sanger/artemis/components/BasePlot.java
index 6503e20eb24d93b920fecaff39e9ac2199cf10a8..9d595b25bd9fb27d6e2bfbc9066dfe5e759880bf 100644
--- a/uk/ac/sanger/artemis/components/BasePlot.java
+++ b/uk/ac/sanger/artemis/components/BasePlot.java
@@ -985,45 +985,43 @@ public class BasePlot extends Plot
     if(offset < 1) 
       offset = 0;
 
-    final int get_values_return_count =
+    final int nvalues =
       getBaseAlgorithm().getValueCount();
     
     int xpos = getPointPosition(event.getPoint().x);
-    
-    //getXCoordinate(getWidthInBases(),
-    //                          offset, event.getPoint().x);
-    
     String tt = Integer.toString(xpos);
     
-    NumberFormat df= NumberFormat.getNumberInstance();
+    NumberFormat df = NumberFormat.getNumberInstance();
     df.setMaximumFractionDigits(2);
     
-    float ypos;
-    for(int value_index = 0; value_index < get_values_return_count;
-        ++value_index)
-    {
-       ypos = getYCoordinate(step_size, getWindowSize(),
-                             offset, value_array_array[value_index], 
-                             xpos);
-       tt = tt + ", " + df.format(ypos);
-    }
- 
+    for(int i = 0; i < nvalues; ++i)
+      tt += ", " + df.format(
+           getYCoordinate(step_size, getWindowSize(),
+               offset, value_array_array[i], xpos));
+
     if(lines != null)
     {
       // if heat map display column number
       String plotType = lines[0].getPlotType();
       if(plotType.equals(LineAttributes.PLOT_TYPES[2]))
       {
-        final int graph_height = super.getSize().height -
+        final int graph_height = getSize().height -
                   getLabelHeight() - getScaleHeight() - 2;
-        
-        float hgt = ((float)graph_height/(float)lines.length);
+
+        int hgt = graph_height/value_array_array.length;
         float mousePos = (float) (event.getPoint().getY()- 
                   getLabelHeight() - getScaleHeight() - 2.f );
 
         int plotNumber = Math.round(( mousePos / hgt )+.5f);
         if(plotNumber < 1)
           plotNumber = 1;
+        else if(plotNumber > value_array_array.length)
+          plotNumber = value_array_array.length;
+        
+        if(nvalues > 5)
+          tt = Integer.toString(xpos)+", "+df.format(
+              getYCoordinate(step_size, getWindowSize(),
+              offset, value_array_array[plotNumber-1], xpos));
         
         tt = "Plot number : "+plotNumber+"\n"+tt;
       }
diff --git a/uk/ac/sanger/artemis/components/GraphMenu.java b/uk/ac/sanger/artemis/components/GraphMenu.java
index 72b05f3cd27a8fcd01a769e0652b103ffa1e4f40..fde8f89f3d0242698da434a97ee6aa4da720a657 100644
--- a/uk/ac/sanger/artemis/components/GraphMenu.java
+++ b/uk/ac/sanger/artemis/components/GraphMenu.java
@@ -46,6 +46,7 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.io.IOException;
 import java.io.File;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.List;
 import java.util.Vector;
@@ -170,7 +171,7 @@ public class GraphMenu extends JMenu
         {
           try
           {
-            addUserPlot (null);
+            addUserPlot ((uk.ac.sanger.artemis.util.Document)null, false);
             adjustSplitPane(true);
           }
           catch(java.lang.OutOfMemoryError emem)
@@ -245,34 +246,24 @@ public class GraphMenu extends JMenu
     }
     
     // add user plots from the command line JVM option
-    if(System.getProperty("userplot"+ (index > 0 ? index : "")) != null)
+    if(System.getProperty("userplot"+ (index > 0 ? index : "")) != null ||
+       System.getProperty("loguserplot"+ (index > 0 ? index : "")) != null)
     {
-      String plots[] = System.getProperty("userplot"+ (index > 0 ? index : "")).split("[\\s,]");
+      String plots[] = new String[]{};
+      if(System.getProperty("userplot"+ (index > 0 ? index : "")) != null)
+        plots = System.getProperty("userplot"+ (index > 0 ? index : "")).split("[\\s,]");
+      
+      String logplots[] = new String[]{};
+      if(System.getProperty("loguserplot"+ (index > 0 ? index : "")) != null)
+        logplots = System.getProperty("loguserplot"+ (index > 0 ? index : "")).split("[\\s,]");
       try
       {
         for(int i=0;i<plots.length; i++)
-        {
-          if(plots[i].startsWith("http:") ||
-             plots[i].startsWith("file:") ||
-             plots[i].startsWith("ftp:"))
-          {
-            uk.ac.sanger.artemis.util.Document document =
-              new uk.ac.sanger.artemis.util.URLDocument (new URL(plots[i]));
-            addUserPlot (document);
-          }
-          else
-          {
-            File f = new File(plots[i]);
-            if(f.exists())
-            {
-              uk.ac.sanger.artemis.util.Document document =
-                new uk.ac.sanger.artemis.util.FileDocument (f);
-              addUserPlot (document);
-            }
-            else
-              System.err.println(plots[i]+" not found.");
-          }
-        }
+          addUserPlot (plots[i], false);
+        
+        for(int i=0;i<logplots.length; i++)
+          addUserPlot (logplots[i], true);
+
         splitPane.setDividerSize(3);
         splitPane.setDividerLocation(150);
       }
@@ -559,12 +550,27 @@ public class GraphMenu extends JMenu
     return true;
   }
   
+  private void addUserPlot (final String plot, final boolean isLog) throws MalformedURLException
+  {
+    if (plot.startsWith("http:") || plot.startsWith("file:") || plot.startsWith("ftp:"))
+      addUserPlot(new uk.ac.sanger.artemis.util.URLDocument(new URL(plot)), isLog);
+    else
+    {
+      File f = new File(plot);
+      if (f.exists())
+        addUserPlot(new uk.ac.sanger.artemis.util.FileDocument(f), isLog);
+      else
+        System.err.println(plot + " not found.");
+    }
+  }
+  
   /**
    *  Add a UserDataAlgorithm to the display.
    **/
-  private void addUserPlot (uk.ac.sanger.artemis.util.Document document) 
+  private void addUserPlot (uk.ac.sanger.artemis.util.Document document,
+                            boolean isLog) 
   {
-    final JCheckBox logTransform = new JCheckBox("Use log(data+1)", false);
+    final JCheckBox logTransform = new JCheckBox("Use log(data+1)", isLog);
     if (document == null)
     {
       final JFrame frame = Utilities.getComponentFrame(base_plot_group);
diff --git a/uk/ac/sanger/artemis/components/Plot.java b/uk/ac/sanger/artemis/components/Plot.java
index 7a09c5d9c9afdfcfe88395bf300c3a726c1a3fe0..b5a726915d514c500e50e94def7f14827dda16cb 100644
--- a/uk/ac/sanger/artemis/components/Plot.java
+++ b/uk/ac/sanger/artemis/components/Plot.java
@@ -977,6 +977,10 @@ public abstract class Plot extends JPanel
                                     final float min_value,
                                     final float max_value) 
   {
+    // if a heatmap do not show the average
+    if(lines != null && lines[0].getPlotType().equals(LineAttributes.PLOT_TYPES[2]))
+        return;
+    
     final Float average = getAlgorithm().getAverage();
 
     if(average != null) 
diff --git a/uk/ac/sanger/artemis/components/PrintArtemis.java b/uk/ac/sanger/artemis/components/PrintArtemis.java
index ac1bebf0c133fe90a775b1d5d12e36f78bced6c2..a05c3eef2acf6531a54378c11c069d3419472e13 100644
--- a/uk/ac/sanger/artemis/components/PrintArtemis.java
+++ b/uk/ac/sanger/artemis/components/PrintArtemis.java
@@ -134,10 +134,12 @@ public class PrintArtemis extends ScrollPanel implements Printable
     {
       FeatureList flist = entry.getFeatureList();
       Point ploc = flist.getViewport().getViewPosition();
-      //flist.setOpaque(false);
-      g2d.translate(0,-ploc.y);
-      flist.paintComponent(g2d);
-      //flist.setOpaque(true);
+      BufferedImage offScreen = new BufferedImage(flist.getViewport().getWidth(), 
+          flist.getViewport().getHeight(), BufferedImage.TYPE_INT_RGB);
+      Graphics og = offScreen.getGraphics();
+      og.translate(0,-ploc.y);
+      flist.paintComponent(og);
+      g2d.drawImage(offScreen, 0, 0, null);
     }
   }
 
diff --git a/uk/ac/sanger/artemis/components/ProjectProperty.java b/uk/ac/sanger/artemis/components/ProjectProperty.java
index 267094cf0b3bde84dcbe0a3589ead22866427850..d91a7e1985f0fe3727b768fd5ecefcdfe1209ce8 100644
--- a/uk/ac/sanger/artemis/components/ProjectProperty.java
+++ b/uk/ac/sanger/artemis/components/ProjectProperty.java
@@ -98,11 +98,12 @@ public class ProjectProperty extends JFrame
   private final static int NEXT_GEN_DATA = 3;
   private final static int CHADO = 4;
   private final static int USERPLOT = 5;
+  private final static int LOGUSERPLOT = 6;
   private static org.apache.log4j.Logger logger4j = 
       org.apache.log4j.Logger.getLogger(ProjectProperty.class);
   
   private final static String[] TYPES = 
-    { "title", "sequence", "annotation", "bam", "vcf", "userplot", "chado" };
+    { "title", "sequence", "annotation", "bam", "vcf", "userplot", "log_userplot", "chado" };
   
   public ProjectProperty()
   {
@@ -428,6 +429,8 @@ public class ProjectProperty extends JFrame
         settings.put(ProjectProperty.CHADO, vText);
       else if(keyStr.equals("userplot"))
         settings.put(ProjectProperty.USERPLOT, vText);
+      else if(keyStr.equals("log_userplot"))
+        settings.put(ProjectProperty.LOGUSERPLOT, vText);
     }
     
     // ADD property
@@ -754,6 +757,8 @@ public class ProjectProperty extends JFrame
       {
         System.getProperties().remove("bam");
         System.getProperties().remove("chado");
+        System.getProperties().remove("userplot");
+        System.getProperties().remove("loguserplot");
       }
       catch(Exception e){ e.printStackTrace(); }
       
@@ -793,9 +798,17 @@ public class ProjectProperty extends JFrame
                 userplot += ","+ann.getText().trim();
             }
             if(!userplot.equals(""))
-              System.setProperty("userplot", userplot.replaceFirst(",", ""));
-                
-                
+              System.setProperty("userplot", userplot.replaceFirst(",", "")); 
+            break;
+          case ProjectProperty.LOGUSERPLOT:
+            String loguserplot = "";
+            for(JTextField ann: vText)
+            {
+              if(ann.isEnabled())
+                loguserplot += ","+ann.getText().trim();
+            }
+            if(!loguserplot.equals(""))
+              System.setProperty("loguserplot", loguserplot.replaceFirst(",", "")); 
             break;
           case ProjectProperty.CHADO:
             seenSequence = true;
diff --git a/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java b/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java
index e8e7f432703f96947584396defa06d959e1c6299..9f651b952c224c2165f1eb87abc1fc3944c29335 100644
--- a/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java
+++ b/uk/ac/sanger/artemis/components/alignment/AbstractGraphPanel.java
@@ -168,7 +168,7 @@ public class AbstractGraphPanel extends JPanel
                                     final int hgt,
                                     final Color c)
   {
-    if(bamView.getSelection() != null)
+    if(bamView != null && bamView.getSelection() != null)
     {
       final Range selectedRange = bamView.getSelection().getSelectionRange();
       if(selectedRange != null)
diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java
index 5f394637f873969dc8e786fd45ece5ebde04efc9..891e4387074c127336fc956bb544d7367e35c96d 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamView.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamView.java
@@ -210,6 +210,7 @@ public class BamView extends JPanel
   
   private CoveragePanel coverageView = new CoveragePanel();
   
+  protected static String BAM_SUFFIX = ".*\\.(bam|cram)$";
   /** Used to colour the frames. */
   private static Color LIGHT_GREY = new Color(200, 200, 200);
   private static Color DARK_GREEN = new Color(0, 150, 0);
@@ -2240,10 +2241,10 @@ public class BamView extends JPanel
       {
         FileSelectionDialog bamFileSelection = new FileSelectionDialog(
             null, false, "BamView", "BAM");
-        List<String> bamFiles = bamFileSelection.getFiles(".*\\.(bam|cram)$");
+        List<String> bamFiles = bamFileSelection.getFiles(BAM_SUFFIX);
         int count = bamList.size();
        
-        bamList.addAll(bamFileSelection.getFiles(".*\\.(bam|cram)$"));
+        bamList.addAll(bamFileSelection.getFiles(BAM_SUFFIX));
         
         for(int i=0; i<bamFiles.size(); i++)
           addToViewMenu(i+count);
@@ -3670,7 +3671,7 @@ public class BamView extends JPanel
       System.setProperty("default_directory", System.getProperty("user.dir"));
       FileSelectionDialog fileSelection = new FileSelectionDialog(
           null, true, "BamView", "BAM");
-      bam = fileSelection.getFiles(".*\\.(bam|cram)$"); 
+      bam = fileSelection.getFiles(BAM_SUFFIX); 
       reference = fileSelection.getReferenceFile();
       if(reference == null || reference.equals(""))
         reference = null;
diff --git a/uk/ac/sanger/artemis/components/alignment/FileSelectionDialog.java b/uk/ac/sanger/artemis/components/alignment/FileSelectionDialog.java
index 1e9d24519c6293a5bab658a2d3e4820e646ac05e..c5944bfff3645faed7bcc9f72b8ae9a2cda94bd5 100644
--- a/uk/ac/sanger/artemis/components/alignment/FileSelectionDialog.java
+++ b/uk/ac/sanger/artemis/components/alignment/FileSelectionDialog.java
@@ -29,6 +29,7 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 
 import uk.ac.sanger.artemis.components.StickyFileChooser;
+import uk.ac.sanger.artemis.components.variant.VCFview;
 
 /**
  * File selection panel to allow input of DNA sequences
@@ -66,14 +67,14 @@ public class FileSelectionDialog extends JDialog
   {
     super(f, program+" :: Select Files", true);
 
-    addBamField(fileType);
+    addBamField(fileType, null);
     
     JButton addMoreFiles = new JButton("Add More");
     addMoreFiles.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
       {
-        addBamField(fileType);
+        addBamField(fileType, null);
       }
     });
     
@@ -90,7 +91,7 @@ public class FileSelectionDialog extends JDialog
       c.gridy = ++row;
       dialog.add(referenceField, c);
       JButton selectReference = new JButton("Select...");
-      addActionListener(selectReference, referenceField);
+      addActionListener(selectReference, referenceField, fileType);
       c.gridx = 1;
       dialog.add(selectReference, c);
     }
@@ -120,11 +121,13 @@ public class FileSelectionDialog extends JDialog
    * Add a text field to the dialog for adding in a path
    * to a BAM file.
    */
-  private void addBamField(String fileType)
+  private void addBamField(String fileType, String fileName)
   {
     JTextField bamField = new JTextField(30);
     bamFields.add(bamField);
     
+    if(fileName != null)
+      bamField.setText(fileName);
     bamField.setPreferredSize(
         new Dimension(200,bamField.getPreferredSize().height));
     c.gridy = row;
@@ -135,7 +138,7 @@ public class FileSelectionDialog extends JDialog
     dialog.add(bamField, c);
     c.gridx = 1;
     JButton selectBam = new JButton("Select...");
-    addActionListener(selectBam, bamField);
+    addActionListener(selectBam, bamField, fileType);
     dialog.add(selectBam, c);
     
     pack();
@@ -145,19 +148,51 @@ public class FileSelectionDialog extends JDialog
    * Add action listener to a button.
    * @param fileSelectionButton
    * @param tfield
+   * @param fileType
    */
   private void addActionListener(final JButton fileSelectionButton, 
-                                 final JTextField tfield)
+                                 final JTextField tfield,
+                                 final String fileType)
   {
+    final javax.swing.filechooser.FileFilter filter =
+        new javax.swing.filechooser.FileFilter()
+    {
+      public boolean accept(final File file) 
+      {
+        if(file.isDirectory() ||
+           file.getName().matches(VCFview.VCFFILE_SUFFIX) ||
+           file.getName().matches(BamView.BAM_SUFFIX))
+          return true;
+        return false;
+      }
+
+      public String getDescription() 
+      {
+        return "BAM / VCF files";
+      }
+    };
+    
     fileSelectionButton.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
       {
         StickyFileChooser fileChooser = new StickyFileChooser();
+        fileChooser.setMultiSelectionEnabled(true);
+        fileChooser.setFileFilter(filter);
+        
         int status = fileChooser.showOpenDialog(null);
         if(status == StickyFileChooser.CANCEL_OPTION)
           return;
-        tfield.setText(fileChooser.getSelectedFile().getAbsolutePath());
+        
+        
+        File[] files = fileChooser.getSelectedFiles();
+        tfield.setText(files[0].getAbsolutePath());
+        
+        if(files.length > 1)
+        {
+          for(int i=1; i<files.length; i++)
+            addBamField(fileType, files[i].getAbsolutePath());
+        }
       }
     });
   }
@@ -319,4 +354,5 @@ public class FileSelectionDialog extends JDialog
   {
     return referenceField.getText();
   }
+      
 }
\ No newline at end of file