diff --git a/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java b/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java
index aaeed5af6f3df3cdbcf774700ec320f31e008107..3034e22c89fbb3227fea3c998e42815685f3d6cf 100644
--- a/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java
+++ b/uk/ac/sanger/artemis/io/ChadoCanonicalGene.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/ChadoCanonicalGene.java,v 1.3 2006-07-04 11:06:33 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/ChadoCanonicalGene.java,v 1.4 2006-07-04 15:58:52 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
@@ -33,12 +33,12 @@ import java.util.Enumeration;
 import java.util.List;
 
 /**
- *  Used by GFFStreamFaeture to represent the chado canonical gene.
+ *  Used by GFFStreamFeature to represent the chado canonical gene.
+ *  Contains gene, transcript, exons and proteins.
  **/
 public class ChadoCanonicalGene  
 {
   private Object gene;
-  private String gene_id;
   
   // part_of gene
   private List transcripts = new Vector();
@@ -52,20 +52,20 @@ public class ChadoCanonicalGene
   // srcfeature length
   private int seqlen;
   
-  public void addObject(Object obj, String parent_id, String type)
-               throws InvalidRelationException
-  {
-    if(type.equalsIgnoreCase("polypeptide"))
-      addProtein(parent_id, obj);
-    else if(type.equalsIgnoreCase("exon"))
-      addExon(parent_id, obj);
-  }
   
+  /**
+   * Get the gene feaure object.
+   * @return
+   */
   public Object getGene()
   {
     return gene;
   }
 
+  /**
+   * Set the gene feature object.
+   * @param gene
+   */
   public void setGene(Object gene)
   {
     this.gene = gene;
@@ -76,33 +76,35 @@ public class ChadoCanonicalGene
     transcripts.add(transcript);
   }
   
-  public void addExon(String transcript_id, Object exon, boolean reset) 
+  public void addExon(String transcript_name, 
+                      Object exon, boolean reset) 
          throws InvalidRelationException
   {
-    exons = new Hashtable();
-    addExon(transcript_id, exon);
+    if(reset)
+      exons = new Hashtable();
+    addExon(transcript_name, exon);
   }
   
-  public void addExon(String transcript_id, Object exon) 
+  public void addExon(String transcript_name, Object exon) 
          throws InvalidRelationException
   {   
     final List v_exons;
-    if(exons.containsKey(transcript_id))
-      v_exons = (Vector)exons.get(transcript_id);
+    if(exons.containsKey(transcript_name))
+      v_exons = (Vector)exons.get(transcript_name);
     else
       v_exons = new Vector();
     
     v_exons.add(exon);
-    exons.put(transcript_id, v_exons);
+    exons.put(transcript_name, v_exons);
   }
   
-  public void addProtein(String transcript_id, Object protein) 
+  public void addProtein(String transcript_name, Object protein) 
          throws InvalidRelationException
   {   
-    proteins.put(transcript_id, protein);
+    proteins.put(transcript_name, protein);
   }
   
-  public Object containsTranscript(final StringVector ids)
+  public Object containsTranscript(final StringVector names)
   {
     for(int i=0; i<transcripts.size(); i++)
     {
@@ -110,7 +112,7 @@ public class ChadoCanonicalGene
       {
         Feature transcript = (Feature)transcripts.get(i);
         
-        if( ids.contains((String)transcript.getQualifierByName("ID").getValues().get(0)) )
+        if( names.contains(getIDQualifier(transcript)) )
           return transcript;
       }
       catch(InvalidRelationException e)
@@ -121,40 +123,51 @@ public class ChadoCanonicalGene
     return null;
   }
 
-  public List getExonsOfTranscript(final String transcript_id)
+  public List getExonsOfTranscript(final String transcript_name)
   {
-    if(exons.containsKey(transcript_id))
-      return (List)exons.get(transcript_id);;
+    if(exons.containsKey(transcript_name))
+      return (List)exons.get(transcript_name);
  
     return null;
   }
   
-  public Object getProteinOfTranscript(final String transcript_id)
+  public Object getProteinOfTranscript(final String transcript_name)
   {
-    if(proteins.containsKey(transcript_id))
-      return proteins.get(transcript_id);;
+    if(proteins.containsKey(transcript_name))
+      return proteins.get(transcript_name);;
  
     return null;
   }
-  
-  public Hashtable getExons()
-  {
-    return exons;
-  }
 
+  /**
+   * Get a list of trancripts.
+   * @return
+   */
   public List getTranscripts()
   {
     return transcripts;
   }
   
-  public Object getFeatureFromId(final String id)
+  /**
+   * Search for the feature with a particular uniquename
+   * @param name  uniquename
+   * @return
+   */
+  public Object getFeatureFromId(final String name)
   {
     Object feature = null;
     
     // check gene
     try
     {
-      if(((String)(((Feature)gene).getQualifierByName("ID").getValues().get(0))).equals(id))
+      final String uniquename;
+      
+      if(gene instanceof ChadoFeature)
+        uniquename = ((ChadoFeature)gene).getUniquename();
+      else
+        uniquename = getIDQualifier((Feature)gene);    
+      
+      if(uniquename.equals(name))
         return gene;
     }
     catch(InvalidRelationException e)
@@ -164,7 +177,7 @@ public class ChadoCanonicalGene
     
     // check transcript
     StringVector sv = new StringVector();
-    sv.add(id);
+    sv.add(name);
     
     feature = containsTranscript(sv);
     
@@ -172,15 +185,21 @@ public class ChadoCanonicalGene
       return feature;
 
     // check exons
-    feature = getExon(id);
+    feature = getExon(name);
     
     if(feature != null)
       return feature;
     
-    return getProtein(id);
+    return getProtein(name);
   }
   
-  private Object getExon(final String id)
+  /**
+   * Routine to look for a exon with a particular 
+   * uniquename
+   * @param name
+   * @return
+   */
+  private Object getExon(final String name)
   {
     Enumeration enum_exons = exons.elements();
     try
@@ -196,9 +215,9 @@ public class ChadoCanonicalGene
           if(exons.get(i) instanceof ChadoFeature)
             uniquename = ((ChadoFeature)exons.get(i)).getUniquename();
           else
-            uniquename = (String)((Feature)exons.get(i)).getQualifierByName("ID").getValues().get(0);
+            uniquename = getIDQualifier((Feature)exons.get(i));
           
-          if(uniquename.equals(id))
+          if(uniquename.equals(name))
             return exons.get(i);
         }
       }
@@ -210,7 +229,7 @@ public class ChadoCanonicalGene
     return null;
   }
   
-  private Feature getProtein(final String id)
+  private Object getProtein(final String id)
   {
     Enumeration enum_proteins = proteins.elements();
     try
@@ -218,7 +237,7 @@ public class ChadoCanonicalGene
       while(enum_proteins.hasMoreElements())
       {
         Feature protein = (Feature)enum_proteins.nextElement();
-        if(((String)(protein.getQualifierByName("ID").getValues().get(0))).equals(id))
+        if(getIDQualifier(protein).equals(id))
           return protein;
       }
     }
@@ -227,14 +246,28 @@ public class ChadoCanonicalGene
       e.printStackTrace();
     }
     return null;
-    
   }
-
+  
+   
+  private String getIDQualifier(Feature feature) 
+          throws InvalidRelationException
+  {
+    return (String)(feature.getQualifierByName("ID").getValues().get(0));
+  }
+  
+  /**
+   * Get the srcfeature residue length
+   * @return
+   */
   public int getSeqlen()
   {
     return seqlen;
   }
 
+  /**
+   * Set the srcfeature residue length
+   * @param seqlen
+   */
   public void setSeqlen(int seqlen)
   {
     this.seqlen = seqlen;