diff --git a/uk/ac/sanger/artemis/components/alignment/MappedReads.java b/uk/ac/sanger/artemis/components/alignment/MappedReads.java
index 145442b53e136e182d6dd7515641375cd29dff24..e51f5f0cc98c49e6baae68d19fda195542d6d297 100644
--- a/uk/ac/sanger/artemis/components/alignment/MappedReads.java
+++ b/uk/ac/sanger/artemis/components/alignment/MappedReads.java
@@ -4,6 +4,8 @@ import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.Point;
 import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.io.File;
 import java.text.DecimalFormat;
 import java.util.Enumeration;
@@ -327,69 +329,134 @@ public class MappedReads
       else
         df = new DecimalFormat("0");
 
-      StringBuffer buff = new StringBuffer();
+      // use two possible titles used for the truncated names and
+      // the full names of BAM's when saved to file
+      final StringBuilder hdr = new StringBuilder();
+      final StringBuilder title = new StringBuilder();
+      final StringBuilder titleToSave = new StringBuilder();
+      final StringBuilder body = new StringBuilder();
+      
       for (int j = 0; j < bamList.size(); j++)
       {
         String bam = bamList.get(j);
-        buff.append("#BAM: " + bam);
+        hdr.append("#BAM: " + bam);
         if (mappedReads != null)
         {
           final DecimalFormat df2 = new DecimalFormat("0.000000");
-          buff.append(" Mapped Reads/million: "
+          hdr.append(" Mapped Reads/million: "
               + df2.format(((float) mappedReads[j]) / 1000000.f));
         }
-        buff.append("\n");
+        hdr.append("\n");
       }
-      buff.append("\n");
+      hdr.append("\n");
 
-      Enumeration<String> enumFeat = featureReadCount.keys();
+      final Enumeration<String> enumFeat = featureReadCount.keys();
       int n = 0;
       while (enumFeat.hasMoreElements())
       {
-        String fId = enumFeat.nextElement();
+        final String fId = enumFeat.nextElement();
         if(n == 0)
         {
-          for (int i = 0; i < ((String)fId).length(); i++)
-            buff.append(" ");
-          buff.append("\t");
+          for (int i = 0; i < fId.length(); i++)
+          {
+            titleToSave.append(" ");
+            title.append(" ");
+          }
+          titleToSave.append("\t");
+          title.append("\t");
+          for (String bam: bamList)
+          {
+            String name = new File(bam).getName();
+            titleToSave.append(name+"\t");
+            if(mappedReads == null)
+            {
+              if(name.length() > 21)
+                 name = "  "+name.substring(0, 19) + "...";
+              else
+              {
+                int len = 21-name.length();
+                name = "  "+name;
+                for (int i = 0; i < len; i++)
+                  name = name+" ";
+              }
+            }
+            else if(mappedReads != null)
+            {
+              if(name.length() > 28)
+                 name = "      "+name.substring(0, 26) + "...";
+              else
+              {
+                int len = 28-name.length(); 
+                name = "      "+name;
+                for (int i = 0; i < len; i++)
+                  name = name+" ";
+              }
+            }
+            title.append(name+"\t");
+          }
+          
+          title.append("\n");
+          titleToSave.append("\n");
+          for (int i = 0; i < fId.length(); i++)
+          {
+            title.append(" ");
+            titleToSave.append(" ");
+          }
+          title.append("\t");
+          titleToSave.append("\t");
           for (int j = 0; j < bamList.size(); j++)
           {
             if(mappedReads != null)
-              buff.append("      Sense   Antisense       Total\t");
+            {
+              title.append("      Sense   Antisense       Total\t");
+              titleToSave.append("      Sense   Antisense       Total\t");
+            }
             else
-              buff.append("  Sense Antisense  Total\t");
+            {
+              title.append("  Sense Antisense  Total\t");
+              titleToSave.append("  Sense Antisense  Total\t");
+            }
           }
-          buff.append("\n");
+          title.append("\n");
+          titleToSave.append("\n");
         }
         
-        buff.append(fId + "\t");
-        List<ReadCount> cnts = featureReadCount.get(fId);
+        body.append(fId + "\t");
+        final List<ReadCount> cnts = featureReadCount.get(fId);
         
         for (ReadCount c: cnts)
         {
-          pad(buff, c.senseCnt, df);
-          buff.append(" ");
-          pad(buff, c.antiCnt, df);
-          buff.append(" ");
-          pad(buff, c.senseCnt+c.antiCnt, df);
-          buff.append("\t");
+          pad(body, c.senseCnt, df);
+          body.append(" ");
+          pad(body, c.antiCnt, df);
+          body.append(" ");
+          pad(body, c.senseCnt+c.antiCnt, df);
+          body.append("\t");
         }
-        buff.append("\n");
+        body.append("\n");
         n++;
       }
 
-      FileViewer viewer;
+      final FileViewer viewer;
+      final ActionListener saveListener = new ActionListener()
+      {
+        public void actionPerformed(ActionEvent e)
+        {
+          FileViewer.writeToFile(hdr.toString()+
+              titleToSave.toString()+body.toString());
+        }
+      };
       if (mappedReads != null)
-        viewer = new FileViewer("RPKM", true, false, true);
+        viewer = new FileViewer("RPKM", true, false, true, saveListener);
       else
-        viewer = new FileViewer("Read Count", true, false, true);
-      viewer.getTextPane().setText(buff.toString());
+        viewer = new FileViewer("Read Count", true, false, true, saveListener);
+      viewer.getTextPane().setText(hdr.toString()+title.toString()+body.toString());
       
       dialog.dispose();
     }
   }
   
-  private static void pad(StringBuffer buff, float f, final DecimalFormat df)
+  private static void pad(StringBuilder buff, float f, final DecimalFormat df)
   {
     if(f < 10)
       buff.append("      ");