diff --git a/uk/ac/sanger/artemis/components/EntryEdit.java b/uk/ac/sanger/artemis/components/EntryEdit.java
index 21c8d82c401dc3d598263bde684cf29e237f3081..5b6428efb10f9fa4c0e81171707f9a197a9d7746 100644
--- a/uk/ac/sanger/artemis/components/EntryEdit.java
+++ b/uk/ac/sanger/artemis/components/EntryEdit.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/EntryEdit.java,v 1.65 2008-06-16 12:11:01 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/EntryEdit.java,v 1.66 2008-06-17 15:15:54 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -31,6 +31,7 @@ import uk.ac.sanger.artemis.chado.ClusterLazyQualifierValue;
 import uk.ac.sanger.artemis.chado.SimilarityLazyQualifierValue;
 import uk.ac.sanger.artemis.components.filetree.FileList;
 import uk.ac.sanger.artemis.components.filetree.FileManager;
+import uk.ac.sanger.artemis.components.genebuilder.GeneUtils;
 import uk.ac.sanger.artemis.editor.BigPane;
 import uk.ac.sanger.artemis.editor.FastaTextPane;
 import uk.ac.sanger.artemis.editor.HitInfo;
@@ -67,7 +68,7 @@ import java.util.Vector;
  *  Each object of this class is used to edit an EntryGroup object.
  *
  *  @author Kim Rutherford
- *  @version $Id: EntryEdit.java,v 1.65 2008-06-16 12:11:01 tjc Exp $
+ *  @version $Id: EntryEdit.java,v 1.66 2008-06-17 15:15:54 tjc Exp $
  *
  */
 public class EntryEdit extends JFrame
@@ -702,69 +703,8 @@ public class EntryEdit extends JFrame
     }
 
     
-    if(entry.getEMBLEntry() instanceof DatabaseDocumentEntry)
-    {    
-      final List lazySimilarityValues = new Vector();
-      final List lazyClusterValues = new Vector();
-      final FeatureVector features = entry.getAllFeatures();
-      // find any lazy values to be loaded
-      
-      
-      for(int i=0; i<features.size(); i++)
-      {
-        QualifierVector qualifiers = features.elementAt(i).getQualifiers();
-        for(int j=0; j<qualifiers.size(); j++)
-        {
-          Qualifier qualifier = (Qualifier)qualifiers.get(j);
-          if(qualifier instanceof QualifierLazyLoading &&
-             !((QualifierLazyLoading)qualifier).isAllLazyValuesLoaded())
-          {
-            if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof SimilarityLazyQualifierValue )
-              lazySimilarityValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() );
-            else if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof ClusterLazyQualifierValue )
-            {
-              lazyClusterValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() );
-            }
-            else
-              ((QualifierLazyLoading)qualifier).setForceLoad(true);
-          }
-        }
-      }
-      
-      if(lazySimilarityValues.size() > 0 || lazyClusterValues.size() > 0)
-      {
-        int n = JOptionPane.showConfirmDialog(null,
-          "Load and write to file all qualifers from the database?"+
-          "\nThis may take a few minutes.",
-          "Load All Data",
-          JOptionPane.YES_NO_OPTION);
-        
-        if(n == JOptionPane.YES_OPTION)
-        {     
-          setCursor(new Cursor(Cursor.WAIT_CURSOR));
-          final DatabaseDocument document = 
-            (DatabaseDocument)((DocumentEntry)entry.getEMBLEntry()).getDocument();
-          
-          if(lazySimilarityValues.size() > 0)
-            SimilarityLazyQualifierValue.bulkRetrieve(lazySimilarityValues,document);
-          
-          if(lazyClusterValues.size() > 0)
-            ClusterLazyQualifierValue.setClusterFromValueList(lazyClusterValues, document);
-          
-          for(int i=0; i<features.size(); i++)
-          {
-            QualifierVector qualifiers = features.elementAt(i).getQualifiers();
-            for(int j=0; j<qualifiers.size(); j++)
-            {
-              Qualifier qualifier = (Qualifier)qualifiers.get(j);
-              if(qualifier instanceof QualifierLazyLoading)
-                ((QualifierLazyLoading)qualifier).setForceLoad(true);
-            }
-          }
-          setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
-        }
-      }
-    }
+    if(entry.getEMBLEntry() instanceof DatabaseDocumentEntry) 
+      GeneUtils.lazyLoadAll(entry, this);
 
     
 //  if(!System.getProperty("os.arch").equals("alpha"))
diff --git a/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java b/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java
index 646d0fc54faec1b772b40de493f4c197f52ff5b2..63323579e96f47fc30d42784cd715d43eef5c073 100644
--- a/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java
+++ b/uk/ac/sanger/artemis/components/ReadAndWriteEntry.java
@@ -26,9 +26,11 @@ import java.io.File;
 import java.io.IOException;
 
 import uk.ac.sanger.artemis.components.database.DatabaseEntrySource;
+import uk.ac.sanger.artemis.components.genebuilder.GeneUtils;
 import uk.ac.sanger.artemis.io.DocumentEntryFactory;
 import uk.ac.sanger.artemis.io.EntryInformationException;
 import uk.ac.sanger.artemis.sequence.NoSequenceException;
+import uk.ac.sanger.artemis.util.DatabaseDocument;
 import uk.ac.sanger.artemis.util.InputStreamProgressEvent;
 import uk.ac.sanger.artemis.util.InputStreamProgressListener;
 import uk.ac.sanger.artemis.util.OutOfRangeException;
@@ -39,13 +41,19 @@ class ReadAndWriteEntry
 
   private static org.apache.log4j.Logger logger4j = 
     org.apache.log4j.Logger.getLogger(ReadAndWriteEntry.class);
-  
-
-  
-  public static Entry readEntryFromDatabase(final String srcFeatureId) 
+ 
+  /**
+   * Read from the database, given a srcFeature uniquename
+   * @param uniqueName
+   * @return
+   * @throws OutOfRangeException
+   * @throws NoSequenceException
+   * @throws IOException
+   */
+  public static Entry readEntryFromDatabase(final String uniqueName) 
          throws OutOfRangeException, NoSequenceException, IOException
   {
-    DatabaseEntrySource entry_source = new DatabaseEntrySource();
+    final DatabaseEntrySource entry_source = new DatabaseEntrySource();
     boolean promptUser = true;
     if(System.getProperty("read_only") != null)
       promptUser = false;
@@ -60,6 +68,8 @@ class ReadAndWriteEntry
     if(userName.startsWith("user="))
       userName = userName.substring(5);
     
+    final String srcFeatureId = getFeatureId(entry_source, uniqueName);
+    
     final InputStreamProgressListener stream_progress_listener =
         new InputStreamProgressListener() 
     {
@@ -75,26 +85,47 @@ class ReadAndWriteEntry
       }
     };
     return entry_source.getEntry(srcFeatureId, userName, 
-                                    stream_progress_listener);
+                                 stream_progress_listener);
   }
   
-  public static void writeEntry(final Entry entry) 
+  /**
+   * Write entry to a file
+   * @param entry
+   * @param file
+   * @throws IOException
+   * @throws EntryInformationException
+   */
+  public static void writeEntry(final Entry entry, final File file) 
          throws IOException, EntryInformationException
   {
-    File file = new File("x");
+    System.out.println(file.getAbsolutePath());
+    GeneUtils.lazyLoadAll(entry, null);
     entry.save(file, DocumentEntryFactory.EMBL_FORMAT, false);
   }
   
+  /**
+   * Get feature id
+   * @param entry_source
+   * @param srcUniqueName
+   * @return
+   */
+  public static String getFeatureId(
+      final DatabaseEntrySource entry_source, final String srcUniqueName)
+  {
+    final DatabaseDocument doc = entry_source.getDatabaseDocument();
+    org.gmod.schema.sequence.Feature feature = doc.getFeatureByUniquename(srcUniqueName);
+    return Integer.toString(feature.getFeatureId());
+  }
+  
   public static void main(final String args[])
   {
     try
     {
-      Entry entry = ReadAndWriteEntry.readEntryFromDatabase("1");
-      ReadAndWriteEntry.writeEntry(entry);
+      Entry entry = ReadAndWriteEntry.readEntryFromDatabase("Pf3D7_03");
+      ReadAndWriteEntry.writeEntry(entry,new File("Pf3D7_03"));
     }
     catch(Exception e)
     {
-      // TODO Auto-generated catch block
       e.printStackTrace();
     }
   }
diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java
index b53ff5c2a82feb5d2fde95132105b010aace42cc..639560e761960478aaf8ccc339ad86a8de0f2bab 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java
@@ -21,6 +21,7 @@
 package uk.ac.sanger.artemis.components.genebuilder;
 
 import java.awt.BorderLayout;
+import java.awt.Cursor;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Collection;
@@ -47,11 +48,14 @@ import org.gmod.schema.sequence.FeatureDbXRef;
 import org.gmod.schema.sequence.FeaturePub;
 import org.gmod.schema.sequence.FeatureSynonym;
 
+import uk.ac.sanger.artemis.chado.ClusterLazyQualifierValue;
+import uk.ac.sanger.artemis.chado.SimilarityLazyQualifierValue;
 import uk.ac.sanger.artemis.components.EditMenu;
 import uk.ac.sanger.artemis.components.MessageDialog;
 import uk.ac.sanger.artemis.components.SelectionMenu;
 import uk.ac.sanger.artemis.io.ChadoCanonicalGene;
 import uk.ac.sanger.artemis.io.DatabaseDocumentEntry;
+import uk.ac.sanger.artemis.io.DocumentEntry;
 import uk.ac.sanger.artemis.io.EntryInformationException;
 import uk.ac.sanger.artemis.io.Feature;
 import uk.ac.sanger.artemis.io.GFFStreamFeature;
@@ -60,6 +64,7 @@ import uk.ac.sanger.artemis.io.Key;
 import uk.ac.sanger.artemis.io.KeyVector;
 import uk.ac.sanger.artemis.io.Location;
 import uk.ac.sanger.artemis.io.Qualifier;
+import uk.ac.sanger.artemis.io.QualifierLazyLoading;
 import uk.ac.sanger.artemis.io.QualifierVector;
 import uk.ac.sanger.artemis.io.Range;
 import uk.ac.sanger.artemis.io.RangeVector;
@@ -270,6 +275,71 @@ public class GeneUtils
     feature.setQualifier(new Qualifier("ID", feature.getSegmentID( rv )));
   }
   
+  public static void lazyLoadAll(final Entry entry, final JFrame parent)
+  {
+    final List lazySimilarityValues = new Vector();
+    final List lazyClusterValues = new Vector();
+    final FeatureVector features = entry.getAllFeatures();
+    // find any lazy values to be loaded
+    
+    
+    for(int i=0; i<features.size(); i++)
+    {
+      QualifierVector qualifiers = features.elementAt(i).getQualifiers();
+      for(int j=0; j<qualifiers.size(); j++)
+      {
+        Qualifier qualifier = (Qualifier)qualifiers.get(j);
+        if(qualifier instanceof QualifierLazyLoading &&
+           !((QualifierLazyLoading)qualifier).isAllLazyValuesLoaded())
+        {
+          if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof SimilarityLazyQualifierValue )
+            lazySimilarityValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() );
+          else if( ((QualifierLazyLoading)qualifier).getValue(0) instanceof ClusterLazyQualifierValue )
+          {
+            lazyClusterValues.addAll( ((QualifierLazyLoading)qualifier).getLazyValues() );
+          }
+          else
+            ((QualifierLazyLoading)qualifier).setForceLoad(true);
+        }
+      }
+    }
+    
+    if(lazySimilarityValues.size() > 0 || lazyClusterValues.size() > 0)
+    {
+      int n = JOptionPane.showConfirmDialog(null,
+        "Load and write to file all qualifers from the database?"+
+        "\nThis may take a few minutes.",
+        "Load All Data",
+        JOptionPane.YES_NO_OPTION);
+      
+      if(n == JOptionPane.YES_OPTION)
+      {
+        if(parent != null)
+          parent.setCursor(new Cursor(Cursor.WAIT_CURSOR));
+        final DatabaseDocument document = 
+          (DatabaseDocument)((DocumentEntry)entry.getEMBLEntry()).getDocument();
+        
+        if(lazySimilarityValues.size() > 0)
+          SimilarityLazyQualifierValue.bulkRetrieve(lazySimilarityValues,document);
+        
+        if(lazyClusterValues.size() > 0)
+          ClusterLazyQualifierValue.setClusterFromValueList(lazyClusterValues, document);
+        
+        for(int i=0; i<features.size(); i++)
+        {
+          QualifierVector qualifiers = features.elementAt(i).getQualifiers();
+          for(int j=0; j<qualifiers.size(); j++)
+          {
+            Qualifier qualifier = (Qualifier)qualifiers.get(j);
+            if(qualifier instanceof QualifierLazyLoading)
+              ((QualifierLazyLoading)qualifier).setForceLoad(true);
+          }
+        }
+        if(parent != null)
+          parent.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
+      }
+    }
+  }
   
   /**
    * Sorts the elements of the vector using a simple O(n^2) selection
diff --git a/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java b/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java
index 2c751d3efe3d722ad1ff4e29b97b77de0e3bb82a..423e2e65615fbfef5005d821db87f433301c06da 100644
--- a/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java
+++ b/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java,v 1.9 2008-06-16 12:13:14 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/PublicDBDocumentEntry.java,v 1.10 2008-06-17 15:15:54 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
@@ -36,7 +36,7 @@ import java.io.IOException;
  *  entry.
  *
  *  @author Kim Rutherford
- *  @version $Id: PublicDBDocumentEntry.java,v 1.9 2008-06-16 12:13:14 tjc Exp $
+ *  @version $Id: PublicDBDocumentEntry.java,v 1.10 2008-06-17 15:15:54 tjc Exp $
  **/
 
 public class PublicDBDocumentEntry extends SimpleDocumentEntry
@@ -165,24 +165,27 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry
       qualifiers.addAll(chadoGene.getGene().getQualifiers().copy());
     }
     
+    
+    final String[][] QUALIFIERS_TO_MAP =
+    {
+        {"comment", "note"},
+        {"Dbxref", "db_xref"},
+        {"private", "note"},
+        {"orthologous_to", "ortholog"},
+        {"paralogous_to", "paralog"}
+    };
+    
     try
     {
-      int index = qualifiers.indexOfQualifierWithName("comment");
-      
-      if(index > -1)
-      {
-        StringVector comments = ((Qualifier)qualifiers.get(index)).getValues();
-        Qualifier noteQualifier = new Qualifier("note", comments);
-        qualifiers.setQualifier(noteQualifier);
-      }
+      for(int i=0; i<QUALIFIERS_TO_MAP.length; i++)
+        changeQualifierName(qualifiers, QUALIFIERS_TO_MAP[i][0], QUALIFIERS_TO_MAP[i][1]);
       
       for(int i=0; i<QUALIFIERS_TO_REMOVE.length; i++)
       {
-        index = qualifiers.indexOfQualifierWithName(QUALIFIERS_TO_REMOVE[i]);
-        if(index > -1)
-          qualifiers.removeElementAt(index);
+        qualifiers.removeQualifierByName(QUALIFIERS_TO_REMOVE[i]);
+        qualifiers.removeQualifierByName(QUALIFIERS_TO_REMOVE[i]);
+        qualifiers.removeQualifierByName(QUALIFIERS_TO_REMOVE[i]);
       }
-
       
       if(key.getKeyString().equals(DatabaseDocument.EXONMODEL))
         key = new Key("CDS");
@@ -196,6 +199,8 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry
         return null;
       else if(key.getKeyString().equals("gene"))
         return null;
+      else if(key.getKeyString().equals("centromere"))
+        return null;
       else if(key.getKeyString().equals("transcript") || 
               key.getKeyString().equals("mRNA"))
         return null;
@@ -273,6 +278,27 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry
     }
   }
   
+  /**
+   * Change the name of a qualifier
+   * @param qualifiers
+   * @param oldName
+   * @param newName
+   */
+  private void changeQualifierName(final QualifierVector qualifiers, 
+                                   final String oldName, 
+                                   final String newName)
+  {
+    int index = qualifiers.indexOfQualifierWithName(oldName);
+    
+    if(index > -1)
+    {
+      StringVector values = ((Qualifier)qualifiers.get(index)).getValues();
+      qualifiers.removeQualifierByName(oldName);
+      Qualifier newQualifier = new Qualifier(newName, values);
+      qualifiers.setQualifier(newQualifier);
+    }  
+  }
+  
   /**
    *  If the given Sequence can be added directly to this Entry, then return a
    *  copy of it, otherwise create and return a new feature of the appropriate
@@ -280,7 +306,7 @@ public class PublicDBDocumentEntry extends SimpleDocumentEntry
    **/
   protected StreamSequence makeNativeSequence (final Sequence sequence) 
   {
-    if(this instanceof EmblDocumentEntry) 
+    if(this instanceof EmblDocumentEntry)
       return new EmblStreamSequence (sequence);
     else 
       return new GenbankStreamSequence (sequence);