diff --git a/uk/ac/sanger/artemis/components/DatabaseEntrySource.java b/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
index 03974a70ab4e93e402ba3849beafd0604e3ad025..ce2d44c82abcff806a22ea733ab9b9caa8ec4df5 100644
--- a/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
+++ b/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
@@ -54,6 +54,7 @@ public class DatabaseEntrySource implements EntrySource
 {
   private String location;
   private Hashtable entries;
+  private boolean splitGFFEntry;
 
   /**
    *  Create a new DatabaseEntrySource.
@@ -301,6 +302,10 @@ public class DatabaseEntrySource implements EntrySource
     }
   }
 
+  protected void setSplitGFF(final boolean splitGFFEntry)
+  {
+    this.splitGFFEntry = splitGFFEntry;
+  }
 
   /**
    *
@@ -326,17 +331,13 @@ public class DatabaseEntrySource implements EntrySource
     {
       DatabaseDocumentEntry db_entry = null;
 
-//    final EntryInformation entry_information =
-//      new SimpleEntryInformation(Options.getArtemisEntryInformation());
-
       if(read_only) 
       {
       } 
       else 
       {
-        DatabaseDocument doc = new DatabaseDocument(location, id, progress_listener);
-//      DatabaseDocument doc = new DatabaseDocument("jdbc:postgresql://localhost:13001/chadoCVS?user=es2",
-//                                                  id, progress_listener);
+        DatabaseDocument doc = new DatabaseDocument(location, id, 
+                               splitGFFEntry, progress_listener);
         db_entry = new DatabaseDocumentEntry(doc);
       }
 
@@ -379,4 +380,29 @@ public class DatabaseEntrySource implements EntrySource
     return null;
   }
 
+  protected DatabaseDocumentEntry[] 
+                         makeFromGff(final DatabaseDocument doc, String id)
+               throws OutOfRangeException, IOException
+  {
+    DatabaseDocumentEntry[] db_entry = null;
+ 
+    try
+    {
+      DatabaseDocument[] new_docs = doc.getGffDocuments(location, id);
+      db_entry = new DatabaseDocumentEntry[new_docs.length];
+
+      for(int i=1; i<new_docs.length; i++)
+        db_entry[i-1] = new DatabaseDocumentEntry(new_docs[i]);
+    }
+    catch(EntryInformationException e)
+    {
+      JOptionPane.showMessageDialog(null,
+                       "Failed to get entry: " + e,
+                       "Entry Information Exception",
+                       JOptionPane.ERROR_MESSAGE);
+    }
+
+    return db_entry;
+  }
+
 }
diff --git a/uk/ac/sanger/artemis/components/DatabaseJFrame.java b/uk/ac/sanger/artemis/components/DatabaseJFrame.java
index 0fb34b5f8c680fa814126a2fbb10b4b6b535127f..1abe12e4295375fdcdf2647baa1c714f9933f231 100644
--- a/uk/ac/sanger/artemis/components/DatabaseJFrame.java
+++ b/uk/ac/sanger/artemis/components/DatabaseJFrame.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/DatabaseJFrame.java,v 1.4 2005-06-18 07:01:16 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/DatabaseJFrame.java,v 1.5 2005-08-04 15:58:05 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -29,6 +29,8 @@ import uk.ac.sanger.artemis.Entry;
 import uk.ac.sanger.artemis.sequence.*;
 import uk.ac.sanger.artemis.util.InputStreamProgressListener;
 import uk.ac.sanger.artemis.util.OutOfRangeException;
+import uk.ac.sanger.artemis.util.DatabaseDocument;
+import uk.ac.sanger.artemis.io.DatabaseDocumentEntry;
 
 import javax.swing.JFrame;
 import javax.swing.JTree;
@@ -37,6 +39,7 @@ import javax.swing.JSeparator;
 import javax.swing.JMenuBar;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
+import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JLabel;
 import javax.swing.BorderFactory;
@@ -57,6 +60,7 @@ import javax.swing.tree.DefaultMutableTreeNode;
 public class DatabaseJFrame extends JFrame
 {
   private JLabel status_line = new JLabel("");
+  private boolean splitGFFEntry = true;
 
   public DatabaseJFrame(final DatabaseEntrySource entry_source,
                         final ArtemisMain art_main)
@@ -146,6 +150,7 @@ public class DatabaseJFrame extends JFrame
           final InputStreamProgressListener progress_listener =
                                      art_main.getInputStreamProgressListener();
 
+          entry_source.setSplitGFF(splitGFFEntry);
           final Entry entry = entry_source.getEntry(id, progress_listener);
           if(entry == null)
           {
@@ -155,6 +160,24 @@ public class DatabaseJFrame extends JFrame
           }
 
           final EntryEdit new_entry_edit = art_main.makeEntryEdit(entry);
+
+          // add gff entries
+          if(splitGFFEntry)
+          {
+            DatabaseDocumentEntry db_entry = (DatabaseDocumentEntry)entry.getEMBLEntry();
+           
+            final DatabaseDocumentEntry[] entries = 
+                     entry_source.makeFromGff((DatabaseDocument)db_entry.getDocument(), id);
+            for(int i=0; i< entries.length; i++)
+            {
+              if(entries[i] == null)
+                continue;
+
+              final Entry new_entry = new Entry(new_entry_edit.getEntryGroup().getBases(), entries[i]);
+              new_entry_edit.getEntryGroup().add(new_entry);
+            }
+          }
+
           new_entry_edit.setVisible(true);
           status_line.setText("Sequence loaded.");
         }
@@ -209,6 +232,23 @@ public class DatabaseJFrame extends JFrame
     });
     fileMenu.add(fileMenuClose);
 
+    JMenu optionMenu = new JMenu("Options");
+    mBar.add(optionMenu);
+
+    final JCheckBoxMenuItem splitGFF = new JCheckBoxMenuItem("Split GFF into entries",
+                                                        splitGFFEntry);
+    splitGFF.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        if(splitGFF.isSelected())
+          splitGFFEntry = true;
+        else
+          splitGFFEntry = false;
+      }
+    });
+    optionMenu.add(splitGFF);
+
     return mBar;
   }
 }
diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index 8ade09fbfaeffdc322eb10ddd394597bfa550372..669c7bb9eab357f6a91ec706b8772c3d8f14616c 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -50,6 +50,10 @@ public class DatabaseDocument extends Document
   private Vector organism;
   private String sqlLog = System.getProperty("user.home")+
                           System.getProperty("file.separator")+"art_sql_debug.log";
+  private StringBuffer[] gff_buffer;
+  private StringBuffer gff_buff;
+  private String[] types = { "exon", "gene", "CDS", "transcript" };
+  private boolean splitGFFEntry;
 
   /**
    *
@@ -78,13 +82,24 @@ public class DatabaseDocument extends Document
   }
 
   public DatabaseDocument(String location, String feature_id,
+                          boolean splitGFFEntry,
                           InputStreamProgressListener progress_listener)
   {
     super(location);
     this.feature_id = feature_id;
+    this.splitGFFEntry = splitGFFEntry;
     this.progress_listener = progress_listener;
   }
 
+  public DatabaseDocument(String location, String feature_id,
+                          StringBuffer gff_buff, String name)
+  {
+    super(location);
+    this.feature_id = feature_id;
+    this.gff_buff   = gff_buff;
+    this.name = name;
+  }
+
   /**
    *
    *  Append a String to the Document location.
@@ -173,15 +188,34 @@ public class DatabaseDocument extends Document
    **/
   public InputStream getInputStream() throws IOException 
   {
+    ByteArrayInputStream instream;
+
+    if(gff_buff != null)
+    {
+      instream = new ByteArrayInputStream(gff_buff.toString().getBytes());
+      return instream;
+    }
+
     try
     {
       Connection conn = getConnection();
       System.out.println("Connected");
 
-      String entry = getGFF(conn,feature_id) + getSequence(conn);
-//    String entry = getSequence(conn);
+      gff_buffer = getGFF(conn,feature_id);
+      String entry;
+
+      if(splitGFFEntry)
+        entry = gff_buffer[0] + getSequence(conn);
+      else
+      {
+        entry = new String();
+        for(int i=0; i<gff_buffer.length; i++)
+          entry = entry + gff_buffer[i];
+        entry = entry + getSequence(conn);
+      }
+
       appendToLogFile(entry,sqlLog);
-      ByteArrayInputStream instream = new ByteArrayInputStream(entry.getBytes());
+      instream = new ByteArrayInputStream(entry.getBytes());
 
       conn.close();
       return instream;
@@ -195,6 +229,24 @@ public class DatabaseDocument extends Document
     return null;
   }
 
+  public DatabaseDocument[] getGffDocuments(String location, String id)
+  {
+    DatabaseDocument[] new_docs = new DatabaseDocument[gff_buffer.length-1];
+    for(int i=1; i<gff_buffer.length; i++)
+    {
+      String name;
+      if(i >= types.length)
+        name = "other";
+      else
+        name = types[i];
+
+      if(gff_buffer[i].length() > 0)
+        new_docs[i-1] = new DatabaseDocument(location, id, gff_buffer[i], name);
+    }
+
+    return new_docs;
+  }
+
 
   /**
   *
@@ -202,34 +254,28 @@ public class DatabaseDocument extends Document
   * in the form of a GFF stream.
   *
   */ 
-  private String getGFF(Connection conn, String parentFeatureID) 
+  private StringBuffer[] getGFF(Connection conn, String parentFeatureID) 
           throws java.sql.SQLException
   {
     Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
 
-//  String sql = "SELECT strand, fmin, fmax, uniquename, feature.type_id, featureprop.type_id AS prop_type_id, value"+
-//               " FROM feature, featureloc, featureprop WHERE srcfeature_id = "+parentFeatureID+
-//               " and featureloc.feature_id=featureprop.feature_id"+
-//               " and featureloc.feature_id=feature.feature_id";
-
-//  String sql = "SELECT feature.feature_id, object_id, strand, fmin, fmax, uniquename, feature.type_id, "+
-//     " featureprop.type_id AS prop_type_id, featureprop.value FROM feature, featureloc, featureprop, feature_relationship "+
-//     " WHERE srcfeature_id = "+parentFeatureID+" and featureloc.feature_id=featureprop.feature_id and "+
-//     " featureloc.feature_id=feature.feature_id and feature_relationship.subject_id=feature.feature_id";
-
     String sql = "SELECT timelastmodified, feature.feature_id, object_id, strand, fmin, fmax, uniquename, feature.type_id, "+
        " featureprop.type_id AS prop_type_id, featureprop.value FROM  featureloc, featureprop, "+
        " feature LEFT JOIN feature_relationship ON feature_relationship.subject_id=feature.feature_id "+
        " WHERE srcfeature_id = "+parentFeatureID+" and featureloc.feature_id=featureprop.feature_id and "+
-       " featureloc.feature_id=feature.feature_id ORDER BY uniquename";
+       " featureloc.feature_id=feature.feature_id ORDER BY feature.type_id,  uniquename";
 
 
     appendToLogFile(sql,sqlLog);
     ResultSet rs = st.executeQuery(sql);
-    StringBuffer cdsBuffer = new StringBuffer();
+
+    StringBuffer[] buffers = new StringBuffer[types.length+1];
+    for(int i=0; i<buffers.length; i++)
+      buffers[i] = new StringBuffer();
 
     String parentFeature = getFeatureName(parentFeatureID,conn);
     Hashtable hstore = new Hashtable();
+    StringBuffer this_buff;
 
     while(rs.next())
     {
@@ -250,29 +296,38 @@ public class DatabaseDocument extends Document
         parent_id = (String)hstore.get(parent_id);
       
 // make gff format
-      cdsBuffer.append(parentFeature+"\t");    // seqid
-      cdsBuffer.append("chado\t");             // source
-      cdsBuffer.append(typeName+"\t");         // type
-      cdsBuffer.append(fmin+"\t");             // start
-      cdsBuffer.append(fmax+"\t");             // end
-      cdsBuffer.append(".\t");                 // score
+
+      // select buffer
+      this_buff = buffers[types.length];
+      for(int i=0; i<types.length; i++)
+      {
+        if(types[i].equals(typeName))
+          this_buff = buffers[i];
+      }
+
+      this_buff.append(parentFeature+"\t");    // seqid
+      this_buff.append("chado\t");             // source
+      this_buff.append(typeName+"\t");         // type
+      this_buff.append(fmin+"\t");             // start
+      this_buff.append(fmax+"\t");             // end
+      this_buff.append(".\t");                 // score
       if(strand == -1)                         // strand
-        cdsBuffer.append("-\t");
+        this_buff.append("-\t");
       else if(strand == 1)
-        cdsBuffer.append("+\t");
+        this_buff.append("+\t");
       else 
-        cdsBuffer.append(".\t");
+        this_buff.append(".\t");
 
-      cdsBuffer.append(".\t");                 // phase
-      cdsBuffer.append("ID="+name+";");
+      this_buff.append(".\t");                 // phase
+      this_buff.append("ID="+name+";");
 
       if(parent_id != null)
-        cdsBuffer.append("Parent="+parent_id+";");
+        this_buff.append("Parent="+parent_id+";");
 
-      cdsBuffer.append("timelastmodified="+timelastmodified+";");
+      this_buff.append("timelastmodified="+timelastmodified+";");
    
       String value = GFFStreamFeature.encode(rs.getString("value"));
-      cdsBuffer.append(propTypeName+"="+value); // attributes
+      this_buff.append(propTypeName+"="+value); // attributes
 
       int rewind = 0;
       while(rs.next() && rs.getString("uniquename").equals(name))
@@ -280,19 +335,19 @@ public class DatabaseDocument extends Document
         prop_type_id = rs.getLong("prop_type_id");
         propTypeName = getCvtermName(conn,prop_type_id);
         value = GFFStreamFeature.encode(rs.getString("value"));
-        cdsBuffer.append(";"+propTypeName+"="+value);
+        this_buff.append(";"+propTypeName+"="+value);
         rewind++;
       }
 
       if(rewind > 0)
         rs.previous();
 
-      cdsBuffer.append("\n");
+      this_buff.append("\n");
 
       progress_listener.progressMade("Read from database: "+name);
     }
 
-    return cdsBuffer.toString();
+    return buffers;
   }
 
   public static Long getCvtermID(String name)