diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index 079d940d39e839d02b8b15ea9b8e12807917931b..61d8f51a39378d2351dd01dfac4c54d453ef3e54 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -24,7 +24,10 @@
 
 package uk.ac.sanger.artemis.util;
 
+import uk.ac.sanger.artemis.io.ChadoCanonicalGene;
 import uk.ac.sanger.artemis.io.GFFStreamFeature;
+import uk.ac.sanger.artemis.io.InvalidRelationException;
+import uk.ac.sanger.artemis.io.ReadFormatException;
 import uk.ac.sanger.artemis.chado.*;
 import uk.ac.sanger.artemis.components.DatabaseEntrySource;
 
@@ -83,6 +86,8 @@ public class DatabaseDocument extends Document
 
   private List schema_list;
   
+  private boolean gene_builder;
+  
   /**
    * 
    * Create a new Document from a database.
@@ -163,6 +168,31 @@ public class DatabaseDocument extends Document
     }
   }
 
+  /**
+   * Used by the gene builder to read a database entry
+   * for a single gene.
+   * @param location
+   * @param pfield
+   * @param feature_id
+   * @param schema
+   * @param gene_builder
+   */
+  public DatabaseDocument(String location, JPasswordField pfield,
+          String feature_id, String schema, boolean gene_builder)
+  {
+    super(location);
+    this.pfield = pfield;
+    this.feature_id = feature_id;
+    this.schema = schema;
+    this.gene_builder = gene_builder;
+
+    if(System.getProperty("ibatis") != null)
+    {
+      iBatis = true;
+      System.setProperty("chado", location);
+    }
+  }
+  
   public DatabaseDocument(String location, JPasswordField pfield,
                           String feature_id, String schema,
                           ByteBuffer gff_buff, String name)
@@ -261,6 +291,17 @@ public class DatabaseDocument extends Document
     try
     {
       ChadoDAO dao = getDAO();
+      
+      
+      // if creating a gene builder
+      if(gene_builder)
+      {
+        List schemaList = new Vector();
+        schemaList.add(schema);
+        return new ByteArrayInputStream(
+            getGeneFeature(feature_id, schemaList, dao).getBytes());
+      }
+      
       gff_buffer = getGff(dao, feature_id);
 
       ByteBuffer entry = new ByteBuffer();
@@ -406,6 +447,84 @@ public class DatabaseDocument extends Document
     return buffers;
   }
 
+  
+  private ByteBuffer getGeneFeature(final String search_gene, 
+                                    final List schema_search,
+                                    final ChadoDAO dao) 
+          throws SQLException, ReadFormatException
+  {
+    Hashtable id_store = new Hashtable();
+
+    ChadoFeature feature = new ChadoFeature();
+    feature.setUniquename(search_gene);
+    List featureList = dao.getLazyFeature(feature, schema_search);
+
+    ChadoCanonicalGene chado_gene = new ChadoCanonicalGene();
+
+    if(featureList.size() > 1)
+      System.err.println("More than one feature found!");
+
+    feature = (ChadoFeature) featureList.get(0);
+    id_store.put(Integer.toString(feature.getId()), feature.getUniquename());
+
+    List featurelocs = feature.getFeaturelocsForFeatureId();
+    ChadoFeatureLoc featureloc = (ChadoFeatureLoc) featurelocs.get(0);
+    int src = featureloc.getSrcfeature_id();
+
+    ChadoFeature parent = new ChadoFeature();
+    parent.setId(src);
+
+    List parentList = dao.getLazyFeature(parent, schema_search);
+    parent = (ChadoFeature) parentList.get(0);
+    chado_gene.setSeqlen(parent.getLength());
+    chado_gene.setSrcfeature_id(src);
+
+    ByteBuffer buff = new ByteBuffer();
+    
+    chadoToGFF(feature, null, null, null, null, dao,
+               featureloc, buff);
+
+    // get children of gene
+    List relations = feature.getFeatureRelationshipsForObjectId();
+
+    for(int i = 0; i < relations.size(); i++)
+    {
+      ChadoFeature transcript = new ChadoFeature();
+      transcript.setId(((ChadoFeatureRelationship) relations.get(i))
+          .getSubject_id());
+      featureList = dao.getLazyFeature(transcript, schema_search);
+
+      transcript = (ChadoFeature) featureList.get(0);
+      id_store.put(Integer.toString(transcript.getId()), transcript
+          .getUniquename());
+
+      ChadoFeatureLoc loc = ChadoFeature.getFeatureLoc(transcript
+          .getFeaturelocsForFeatureId(), src);
+      chadoToGFF(transcript, feature.getUniquename(), null,
+          null, id_store, dao, loc, buff);
+
+      // get children of transcript - exons and pp
+      List transcipt_relations = transcript.getFeatureRelationshipsForObjectId();
+
+      for(int j = 0; j < transcipt_relations.size(); j++)
+      {
+        ChadoFeature child = new ChadoFeature();
+        child.setId(((ChadoFeatureRelationship) transcipt_relations.get(j))
+            .getSubject_id());
+        featureList = dao.getLazyFeature(child, schema_search);
+
+        child = (ChadoFeature) featureList.get(0);
+        id_store.put(Integer.toString(child.getId()), child.getUniquename());
+
+        loc = ChadoFeature.getFeatureLoc(child.getFeaturelocsForFeatureId(),src);
+        chadoToGFF(child, transcript.getUniquename(), null,
+                   null, id_store, dao, loc, buff);
+      }
+    }
+
+    return buff;
+  }
+  
   /**
    * Convert the chado feature into a GFF line
    * @param feat           Chado feature
@@ -417,14 +536,14 @@ public class DatabaseDocument extends Document
    * @param featureloc     feature location for this chado feature
    * @param this_buff      byte buffer of GFF line 
    */
-  public static void chadoToGFF(final ChadoFeature feat,
-                                final String parentFeature,
-                                final Hashtable dbxrefs,
-                                final Hashtable synonym,
-                                final Hashtable id_store,
-                                final ChadoDAO dao,
-                                final ChadoFeatureLoc featureloc,
-                                final ByteBuffer this_buff)
+  private static void chadoToGFF(final ChadoFeature feat,
+                                 final String parentFeature,
+                                 final Hashtable dbxrefs,
+                                 final Hashtable synonym,
+                                 final Hashtable id_store,
+                                 final ChadoDAO dao,
+                                 final ChadoFeatureLoc featureloc,
+                                 final ByteBuffer this_buff)
   {
     String gff_source = null;