diff --git a/uk/ac/sanger/artemis/components/ActMain.java b/uk/ac/sanger/artemis/components/ActMain.java
index 6466c63a1a9ac3549fb3312761bff9f96372524d..24cc2a37a382d726dccb75919f1f9fd1735e73e3 100644
--- a/uk/ac/sanger/artemis/components/ActMain.java
+++ b/uk/ac/sanger/artemis/components/ActMain.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/ActMain.java,v 1.9 2006-03-02 15:58:46 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/ActMain.java,v 1.10 2006-10-18 14:25:23 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -29,9 +29,13 @@ import uk.ac.sanger.artemis.components.filetree.FileManager;
 import uk.ac.sanger.artemis.components.filetree.LocalAndRemoteFileManager;
 import uk.ac.sanger.artemis.*;
 import uk.ac.sanger.artemis.sequence.Bases;
-import uk.ac.sanger.artemis.components.filetree.FileManager;
+import uk.ac.sanger.artemis.sequence.NoSequenceException;
+import uk.ac.sanger.artemis.components.database.DatabaseEntrySource;
+import uk.ac.sanger.artemis.components.database.DatabaseJFrame;
+import uk.ac.sanger.artemis.components.database.DatabaseTreeNode;
 
 import uk.ac.sanger.artemis.util.*;
+import uk.ac.sanger.artemis.io.DatabaseDocumentEntry;
 import uk.ac.sanger.artemis.io.EntryInformation;
 import uk.ac.sanger.artemis.io.SimpleEntryInformation;
 
@@ -44,7 +48,7 @@ import javax.swing.JFrame;
  *  The main window for the Artemis Comparison Tool.
  *
  *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: ActMain.java,v 1.9 2006-03-02 15:58:46 tjc Exp $
+ *  @version $Id: ActMain.java,v 1.10 2006-10-18 14:25:23 tjc Exp $
  **/
 
 public class ActMain extends Splash 
@@ -94,6 +98,24 @@ public class ActMain extends Splash
     }; 
     makeMenuItem(file_menu, "Open SSH File Manager ...", menu_listener_ssh);
 
+    final boolean sanger_options =
+      Options.getOptions().getPropertyTruthValue("sanger_options");
+
+    if(sanger_options)
+    {
+      ActionListener menu_listener = new ActionListener()
+      {
+        public void actionPerformed(ActionEvent event)
+        {
+          launchDatabaseJFrame(true);
+        }
+      };
+      
+      makeMenuItem(file_menu, "Database Entry ...", menu_listener);
+      if(System.getProperty("chado") != null)
+        launchDatabaseJFrame(false);
+    }
+    
     makeMenuItem(file_menu, "Quit", quit_listener);
   }
 
@@ -110,7 +132,7 @@ public class ActMain extends Splash
    **/
   public static boolean makeMultiComparator(final JFrame frame,
                           final InputStreamProgressListener progress_listener,
-                          final String[] file_names) 
+                          final Object[] file_names) 
   {
 
     final ProgressThread progress_thread = new ProgressThread(null,
@@ -132,8 +154,8 @@ public class ActMain extends Splash
           final EntryInformation entry_information =
             new SimpleEntryInformation(Options.getArtemisEntryInformation());
 
-          final String this_file_name = file_names[i];
-          File this_file = new File(this_file_name);
+          final Object this_file_name = file_names[i];
+          //File this_file = new File(this_file_name);
  
           try 
           {
@@ -158,7 +180,7 @@ public class ActMain extends Splash
         {
           for(int i = 1 ; i < file_names.length ; i += 2) 
           {
-            final String comparison_data_file_name = file_names[i];
+            final String comparison_data_file_name = (String)file_names[i];
             final Document comparison_data_document =
               DocumentFactory.makeDocument(comparison_data_file_name);
 
@@ -213,21 +235,52 @@ public class ActMain extends Splash
           progress_thread.finished();
       }
 
-      private boolean openEntry(String this_file_name, EntryGroup[] entry_group_array,
+      private boolean openEntry(Object this_file_name, EntryGroup[] entry_group_array,
                                 final EntryInformation entry_information, int i)
                       throws OutOfRangeException
       {
-        final Document entry_document =
-              DocumentFactory.makeDocument(this_file_name);
+        uk.ac.sanger.artemis.io.Entry embl_entry = null;
+        
+        // test if this is a database entry rather than a file 
+        if(this_file_name instanceof DatabaseTreeNode)
+        {
+          DatabaseTreeNode dbNode = (DatabaseTreeNode)this_file_name;
+          DatabaseEntrySource entry_source = dbNode.getEntrySource();
+         
+          try
+          {
+            Entry entry = entry_source.getEntry(dbNode.getFeatureId(), 
+                                                dbNode.getSchema(),
+                                                progress_listener);
+            embl_entry = (DatabaseDocumentEntry)entry.getEMBLEntry();
+          }
+          catch(NoSequenceException e)
+          {
+            e.printStackTrace();
+          }
+          catch(IOException e)
+          {
+            e.printStackTrace();
+          }
+          
+          DatabaseDocument doc = 
+            (DatabaseDocument)((DatabaseDocumentEntry)embl_entry).getDocument();
+          doc.setName((String)dbNode.getUserObject());
+        }
+        else
+        {
+          final Document entry_document =
+              DocumentFactory.makeDocument((String)this_file_name);
 
-        if(progress_listener != null)
-          entry_document.addInputStreamProgressListener(progress_listener);
+          if(progress_listener != null)
+            entry_document.addInputStreamProgressListener(progress_listener);
 
-        final uk.ac.sanger.artemis.io.Entry embl_entry =
-            EntryFileDialog.getEntryFromFile(frame, entry_document,
+           embl_entry =
+              EntryFileDialog.getEntryFromFile(frame, entry_document,
                                          entry_information,
                                          false);
-
+        }
+        
         // getEntryFromFile() has alerted the user so we just need to quit
         if(embl_entry == null)
           return false;
@@ -238,7 +291,7 @@ public class ActMain extends Splash
         if(sequence == null)
         {
           new MessageDialog(frame, "This file contains no sequence: " +
-                             this_file_name);
+                             (String)this_file_name);
           return false;
         }
   
@@ -272,6 +325,32 @@ public class ActMain extends Splash
     new ComparatorDialog(this).setVisible(true);
   }
 
+  /**
+  *
+  * Launch database manager window
+  *
+  */
+  private void launchDatabaseJFrame(final boolean prompt_user)
+  {
+    SwingWorker entryWorker = new SwingWorker()
+    {
+      public Object construct()
+      {
+        getStatusLabel().setText("Connecting ...");
+        DatabaseEntrySource entry_source = new DatabaseEntrySource();
+        if(!entry_source.setLocation(prompt_user))
+          return null;
+
+        final DatabaseJFrame frame = new DatabaseJFrame(entry_source,
+                                               ActMain.this);
+        frame.setVisible(true);
+        getStatusLabel().setText("");
+        return null;
+      }
+    };
+    entryWorker.start();
+  }
+  
   /**
    *  Exit from ACT.
    **/
diff --git a/uk/ac/sanger/artemis/components/ArtemisMain.java b/uk/ac/sanger/artemis/components/ArtemisMain.java
index b987acad4b12ce89252e7a97e514d3dafce3ad5d..de4d9054851efaa66c3fe8bc5924f445bc6a549a 100644
--- a/uk/ac/sanger/artemis/components/ArtemisMain.java
+++ b/uk/ac/sanger/artemis/components/ArtemisMain.java
@@ -20,11 +20,13 @@
  * 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/ArtemisMain.java,v 1.20 2006-01-04 14:25:09 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/ArtemisMain.java,v 1.21 2006-10-18 14:25:23 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
 
+import uk.ac.sanger.artemis.components.database.DatabaseEntrySource;
+import uk.ac.sanger.artemis.components.database.DatabaseJFrame;
 import uk.ac.sanger.artemis.components.filetree.FileManager;
 import uk.ac.sanger.artemis.components.filetree.LocalAndRemoteFileManager;
 import uk.ac.sanger.artemis.*;
@@ -48,7 +50,7 @@ import java.awt.datatransfer.*;
  *  The main window for the Artemis sequence editor.
  *
  *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: ArtemisMain.java,v 1.20 2006-01-04 14:25:09 tjc Exp $
+ *  @version $Id: ArtemisMain.java,v 1.21 2006-10-18 14:25:23 tjc Exp $
  **/
 
 public class ArtemisMain extends Splash 
@@ -602,7 +604,7 @@ public class ArtemisMain extends Splash
   /**
    *  Make an EntryEdit component from the given Entry.
    **/
-  protected EntryEdit makeEntryEdit(final Entry entry) 
+  public static EntryEdit makeEntryEdit(final Entry entry) 
   {
     final Bases bases = entry.getBases();
     final EntryGroup entry_group = new SimpleEntryGroup(bases);
diff --git a/uk/ac/sanger/artemis/components/ComparatorDialog.java b/uk/ac/sanger/artemis/components/ComparatorDialog.java
index 2cc7ff5fd8b1477e8427d7a86bf238f43b73f66a..f922309d72570ccf6eafcb172512daa701030fd9 100644
--- a/uk/ac/sanger/artemis/components/ComparatorDialog.java
+++ b/uk/ac/sanger/artemis/components/ComparatorDialog.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/ComparatorDialog.java,v 1.2 2006-10-18 11:25:12 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/ComparatorDialog.java,v 1.3 2006-10-18 14:25:23 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -41,7 +41,7 @@ import javax.swing.*;
  *  compare with a Comparator component and a file containing comparison data.
  *
  *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: ComparatorDialog.java,v 1.2 2006-10-18 11:25:12 tjc Exp $
+ *  @version $Id: ComparatorDialog.java,v 1.3 2006-10-18 14:25:23 tjc Exp $
  **/
 
 public class ComparatorDialog extends JFrame 
@@ -272,14 +272,18 @@ public class ComparatorDialog extends JFrame
       throw new Error("internal error - not enough file names given to " +
                        "ComparatorDialog.doApply()");
 
-    String [] file_names = new String [text_field_vector.size()];
+    Object[] file_names = new Object[text_field_vector.size()];
 
     for(int i = 0; i < text_field_vector.size(); ++i) 
     {
-      file_names[i] =
-       ((JTextField) text_field_vector.elementAt(i)).getText().trim();
-
-      if(file_names[i].length() == 0) 
+      TextFieldSink tfield = (TextFieldSink)text_field_vector.elementAt(i);
+      
+      if(tfield.getDbNode() != null)
+        file_names[i] = tfield.getDbNode();
+      else
+        file_names[i] = tfield.getText().trim();
+
+      if(file_names[i] instanceof String && ((String)file_names[i]).length() == 0) 
       {
         // ignore the problem if there are at least 3 files listed(ie. seq1
         // comp1v2 seq2) and the remaining files lengths are zero
diff --git a/uk/ac/sanger/artemis/components/TextFieldSink.java b/uk/ac/sanger/artemis/components/TextFieldSink.java
index 61ba9d4b842d0f5b4a509e0a9b06a5e10cdbf473..9ee96dbf2a85d1b8b63860c0898c904cea755bda 100644
--- a/uk/ac/sanger/artemis/components/TextFieldSink.java
+++ b/uk/ac/sanger/artemis/components/TextFieldSink.java
@@ -22,10 +22,13 @@
 package uk.ac.sanger.artemis.components;
 
 import java.awt.datatransfer.*;
+
 import javax.swing.*;
-import javax.swing.event.*;
 import java.awt.event.*;
 import javax.swing.border.*;
+
+import uk.ac.sanger.artemis.components.database.DatabaseTreeNode;
+
 import java.awt.dnd.*;
 import java.awt.*;
 import java.io.*;
@@ -38,6 +41,7 @@ import java.io.*;
 */
 public class TextFieldSink extends JTextField implements DropTargetListener
 {
+  private DatabaseTreeNode dbNode = null;
 
   public TextFieldSink(String text, int columns)
   {
@@ -94,7 +98,8 @@ public class TextFieldSink extends JTextField implements DropTargetListener
 
   public void dragEnter(DropTargetDragEvent e)
   {
-    if(e.isDataFlavorSupported(DataFlavor.stringFlavor))
+    if(e.isDataFlavorSupported(DataFlavor.stringFlavor) ||
+       e.isDataFlavorSupported(DatabaseTreeNode.DATABASETREENODE))
     {
       e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
       this.setBorder(dropBorder);
@@ -110,7 +115,31 @@ public class TextFieldSink extends JTextField implements DropTargetListener
   {
     this.setBorder(endBorder);
     Transferable t = e.getTransferable();
-    if(t.isDataFlavorSupported(DataFlavor.stringFlavor))
+
+    if(t.isDataFlavorSupported(DatabaseTreeNode.DATABASETREENODE))
+    {
+      try
+      {
+        setCursor(new Cursor(Cursor.WAIT_CURSOR));
+        dbNode = 
+          (DatabaseTreeNode)t.getTransferData(DatabaseTreeNode.DATABASETREENODE);
+        this.replaceSelection(dbNode.getSchema()+":featureId="+dbNode.getFeatureId());
+
+        e.dropComplete(true);
+        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
+      }
+      catch(UnsupportedFlavorException e1)
+      {
+        // TODO Auto-generated catch block
+        e1.printStackTrace();
+      }
+      catch(IOException e1)
+      {
+        // TODO Auto-generated catch block
+        e1.printStackTrace();
+      }
+    }
+    else if(t.isDataFlavorSupported(DataFlavor.stringFlavor))
     {
       e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
       try
@@ -131,10 +160,16 @@ public class TextFieldSink extends JTextField implements DropTargetListener
 
   public void dragOver(DropTargetDragEvent e) 
   {
-    if(e.isDataFlavorSupported(DataFlavor.stringFlavor))
+    if(e.isDataFlavorSupported(DataFlavor.stringFlavor) ||
+       e.isDataFlavorSupported(DatabaseTreeNode.DATABASETREENODE))
       e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
   }
   public void dropActionChanged(DropTargetDragEvent e) {}
+
+  public DatabaseTreeNode getDbNode()
+  {
+    return dbNode;
+  }
 }
 
 
diff --git a/uk/ac/sanger/artemis/components/DatabaseEntrySource.java b/uk/ac/sanger/artemis/components/database/DatabaseEntrySource.java
similarity index 81%
rename from uk/ac/sanger/artemis/components/DatabaseEntrySource.java
rename to uk/ac/sanger/artemis/components/database/DatabaseEntrySource.java
index 5c308bf321da3984f7780024431b898006d563b9..90b17acddcadff4b4eff2c31f87fbdb1377745b3 100644
--- a/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
+++ b/uk/ac/sanger/artemis/components/database/DatabaseEntrySource.java
@@ -22,12 +22,9 @@
  *
  */
 
-package uk.ac.sanger.artemis.components;
+package uk.ac.sanger.artemis.components.database;
 
 import javax.swing.*;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreeSelectionModel;
-import javax.swing.tree.TreePath;
 import java.awt.Container;
 import java.awt.GridLayout;
 import java.io.*;
@@ -48,7 +45,7 @@ import uk.ac.sanger.artemis.io.EntryInformationException;
  * This is an EntrySource that reads Entry objects from a relational database.
  * 
  */
-public class DatabaseEntrySource implements EntrySource
+public class DatabaseEntrySource implements EntrySource, Serializable
 {
   private String location;
 
@@ -206,13 +203,6 @@ public class DatabaseEntrySource implements EntrySource
     return true;
   }
 
-  /**
-   * Given the entry name get the seq feature_id
-   */
-  protected String getEntryID(String name)
-  {
-    return (String)entries.get(name);
-  }
 
   /**
    * Create database organism JTree.
@@ -238,58 +228,13 @@ public class DatabaseEntrySource implements EntrySource
       }
     }
     
-    DefaultMutableTreeNode top = new DefaultMutableTreeNode("");
+    DatabaseTreeNode top = new DatabaseTreeNode("", DatabaseEntrySource.this);
     createNodes(top, doc.getSchema(), entries);
-    final JTree tree = new JTree(top);
-    tree.getSelectionModel().setSelectionMode(
-        TreeSelectionModel.SINGLE_TREE_SELECTION);
-
+    final DatabaseJTree tree = new DatabaseJTree(top);
+ 
     return tree;
   }
 
-  /**
-   * Get DefaultMutableTreeNode of selected node.
-   * @param tree  the <code>Jtree</code> component
-   * @return node that is currently selected
-   */
-  protected String getSelectedNode(JTree tree)
-  {
-    TreePath path = tree.getLeadSelectionPath();
-    if (path == null)
-      return null;
-
-    DefaultMutableTreeNode seq_node = 
-                            (DefaultMutableTreeNode)path.getLastPathComponent();
-    DefaultMutableTreeNode type_node =
-                            (DefaultMutableTreeNode)seq_node.getParent();
-    DefaultMutableTreeNode schema_node = 
-                            (DefaultMutableTreeNode)type_node.getParent();
-
-    return (String)schema_node.getUserObject() + " - " +
-           (String)type_node.getUserObject() + " - " +
-           (String)seq_node.getUserObject();
-  }
-
-  /**
-   * Get schema of the selected node
-   * @param tree  the <code>Jtree</code> component
-   * @return name of Organism that is top level of selected node
-   */
-  protected String getSchemaOfSelectedNode(JTree tree)
-  {
-    TreePath path = tree.getLeadSelectionPath();
-    if(path == null)
-      return null;
-
-    DefaultMutableTreeNode seq_node = 
-                            (DefaultMutableTreeNode)path.getLastPathComponent();
-    DefaultMutableTreeNode type_node = 
-                            (DefaultMutableTreeNode)seq_node.getParent();
-    DefaultMutableTreeNode schema_node = 
-                            (DefaultMutableTreeNode)type_node.getParent();
-
-    return (String)schema_node.getUserObject();
-  }
 
   /**
    * Create the nodes of the organism JTree
@@ -297,12 +242,12 @@ public class DatabaseEntrySource implements EntrySource
    * @param schema    <code>List</code>
    * @param organism  sequences collection
    */
-  private void createNodes(DefaultMutableTreeNode top, List schema,
+  private void createNodes(DatabaseTreeNode top, List schema,
                            Hashtable entries)
   {
-    DefaultMutableTreeNode schema_node;
-    DefaultMutableTreeNode seq_node;
-    DefaultMutableTreeNode typ_node;
+    DatabaseTreeNode schema_node;
+    DatabaseTreeNode seq_node;
+    DatabaseTreeNode typ_node;
 
     final Object v_organism[] = entries.keySet().toArray();
     final int v_organism_size = v_organism.length;
@@ -318,12 +263,14 @@ public class DatabaseEntrySource implements EntrySource
       else
         name = ((Organism)schema.get(i)).getCommonName();
       
-      schema_node = new DefaultMutableTreeNode(name);
+      schema_node = new DatabaseTreeNode(name, DatabaseEntrySource.this);
       Hashtable seq_type_node = new Hashtable();
 
       for(int j = 0; j < v_organism_size; j++)
       {
-        String seq_name = (String)v_organism[j];
+        String seq_name  = (String)v_organism[j];
+        String featureId = (String)entries.get(seq_name);
+        
         if(seq_name.startsWith(name))
         {
           int ind1 = seq_name.indexOf("- ");
@@ -334,14 +281,16 @@ public class DatabaseEntrySource implements EntrySource
 
           if(!seq_type_node.containsKey(type))
           {
-            typ_node = new DefaultMutableTreeNode(type);
+            typ_node = new DatabaseTreeNode(type, DatabaseEntrySource.this);
             seq_type_node.put(type, typ_node);
             schema_node.add(typ_node);
           }
           else
-            typ_node = (DefaultMutableTreeNode) seq_type_node.get(type);
+            typ_node = (DatabaseTreeNode) seq_type_node.get(type);
 
-          seq_node = new DefaultMutableTreeNode(seq_name);
+          seq_node = new DatabaseTreeNode(seq_name, 
+                                          DatabaseEntrySource.this, 
+                                          featureId, name);
           typ_node.add(seq_node);
           nchild++;
         }
diff --git a/uk/ac/sanger/artemis/components/DatabaseJFrame.java b/uk/ac/sanger/artemis/components/database/DatabaseJFrame.java
similarity index 82%
rename from uk/ac/sanger/artemis/components/DatabaseJFrame.java
rename to uk/ac/sanger/artemis/components/database/DatabaseJFrame.java
index 4810838ac2e18a1f2dc9a476d11aec142754db72..52b50161cbb2d9644cb55f11bbb1c7b0224f5e01 100644
--- a/uk/ac/sanger/artemis/components/DatabaseJFrame.java
+++ b/uk/ac/sanger/artemis/components/database/DatabaseJFrame.java
@@ -20,10 +20,12 @@
  * 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.10 2006-10-17 10:18:56 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/database/DatabaseJFrame.java,v 1.1 2006-10-18 14:25:23 tjc Exp $
  */
 
-package uk.ac.sanger.artemis.components;
+package uk.ac.sanger.artemis.components.database;
+
+import uk.ac.sanger.artemis.components.*;
 
 import uk.ac.sanger.artemis.Entry;
 import uk.ac.sanger.artemis.sequence.*;
@@ -44,6 +46,8 @@ import javax.swing.JPanel;
 import javax.swing.JLabel;
 import javax.swing.BorderFactory;
 import javax.swing.border.Border;
+import javax.swing.tree.TreePath;
+
 import java.awt.BorderLayout;
 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
@@ -62,7 +66,7 @@ public class DatabaseJFrame extends JFrame
   private boolean splitGFFEntry = false;
 
   public DatabaseJFrame(final DatabaseEntrySource entry_source,
-      final ArtemisMain art_main)
+      final Splash splash_main)
   {
     super("Organism List");
     final JTree tree = entry_source.getDatabaseTree();
@@ -73,7 +77,7 @@ public class DatabaseJFrame extends JFrame
       public void mouseClicked(MouseEvent e)
       {
         if(e.getClickCount() == 2 && !e.isPopupTrigger())
-          showSelected(entry_source, tree, art_main);
+          showSelected(entry_source, tree, splash_main);
       }
     };
     tree.addMouseListener(mouseListener);
@@ -85,7 +89,7 @@ public class DatabaseJFrame extends JFrame
                                         screen.height * 6 / 10);
     scroll.setPreferredSize(dim_frame);
 
-    setJMenuBar(makeMenuBar(entry_source, tree, art_main));
+    setJMenuBar(makeMenuBar(entry_source, tree, splash_main));
 
     JPanel pane = (JPanel)getContentPane();
     pane.add(scroll, BorderLayout.CENTER);
@@ -113,17 +117,23 @@ public class DatabaseJFrame extends JFrame
    * 
    */
   private void showSelected(final DatabaseEntrySource entry_source,
-      final JTree tree, final ArtemisMain art_main)
+      final JTree tree, final Splash splash_main)
   {
-    String node_name = null;
-
     try
     {
-      node_name = entry_source.getSelectedNode(tree);
-      String id = entry_source.getEntryID(node_name);
+      TreePath path = tree.getLeadSelectionPath();
+      if(path == null)
+        return;
+      DatabaseTreeNode seq_node = 
+        (DatabaseTreeNode)path.getLastPathComponent();
+      String node_name = (String)seq_node.getUserObject();
+      String schema = seq_node.getSchema();
+      
+      String id = seq_node.getFeatureId(); 
       if(id != null)
         getEntryEditFromDatabase(id, entry_source, tree,
-                                 art_main, node_name);
+                                 splash_main, node_name,
+                                 schema);
     }
     catch(NullPointerException npe)
     {
@@ -137,7 +147,8 @@ public class DatabaseJFrame extends JFrame
    */
   private void getEntryEditFromDatabase(final String id,
       final DatabaseEntrySource entry_source, final JTree tree,
-      final ArtemisMain art_main, final String node_name)
+      final Splash splash_main, final String node_name,
+      final String schema)
   {
     SwingWorker entryWorker = new SwingWorker()
     {
@@ -151,25 +162,17 @@ public class DatabaseJFrame extends JFrame
         try
         {
           final InputStreamProgressListener progress_listener = 
-                           art_main.getInputStreamProgressListener();
+                           splash_main.getInputStreamProgressListener();
 
           entry_source.setSplitGFF(splitGFFEntry);
 
-          String schema = entry_source.getSchemaOfSelectedNode(tree);
-
           final Entry entry = entry_source.getEntry(id, schema,
                                                     progress_listener);
 
 
           DatabaseDocumentEntry db_entry =
                          (DatabaseDocumentEntry)entry.getEMBLEntry();
-
-          int ind = 0;
-          String name = node_name;
-          if( (ind = name.lastIndexOf("-")) > -1)
-            name = name.substring(ind+1).trim();
-
-          ((DatabaseDocument)db_entry.getDocument()).setName(name);
+          ((DatabaseDocument)db_entry.getDocument()).setName(node_name);
 
           if(entry == null)
           {
@@ -178,7 +181,7 @@ public class DatabaseJFrame extends JFrame
             return null;
           }
 
-          final EntryEdit new_entry_edit = art_main.makeEntryEdit(entry);
+          final EntryEdit new_entry_edit = ArtemisMain.makeEntryEdit(entry);
 
           // add gff entries
           if(splitGFFEntry)
@@ -204,17 +207,17 @@ public class DatabaseJFrame extends JFrame
         }
         catch(OutOfRangeException e)
         {
-          new MessageDialog(art_main, "read failed: one of the features in "
+          new MessageDialog(splash_main, "read failed: one of the features in "
               + " the entry has an out of range " + "location: "
               + e.getMessage());
         }
         catch(NoSequenceException e)
         {
-          new MessageDialog(art_main, "read failed: entry contains no sequence");
+          new MessageDialog(splash_main, "read failed: entry contains no sequence");
         }
         catch(IOException e)
         {
-          new MessageDialog(art_main, "read failed due to IO error: " + e);
+          new MessageDialog(splash_main, "read failed due to IO error: " + e);
         }
         tree.setCursor(cdone);
         return null;
@@ -226,7 +229,7 @@ public class DatabaseJFrame extends JFrame
   }
 
   private JMenuBar makeMenuBar(final DatabaseEntrySource entry_source,
-                               final JTree tree, final ArtemisMain art_main)
+                               final JTree tree, final Splash splash_main)
   {
     JMenuBar mBar = new JMenuBar();
     JMenu fileMenu = new JMenu("File");
@@ -237,7 +240,7 @@ public class DatabaseJFrame extends JFrame
     {
       public void actionPerformed(ActionEvent e)
       {
-        showSelected(entry_source, tree, art_main);
+        showSelected(entry_source, tree, splash_main);
       }
     });
     fileMenu.add(fileShow);
diff --git a/uk/ac/sanger/artemis/components/database/DatabaseJTree.java b/uk/ac/sanger/artemis/components/database/DatabaseJTree.java
new file mode 100644
index 0000000000000000000000000000000000000000..b50ab54efefb5856b1e30c0cef0e0647ce84e465
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/database/DatabaseJTree.java
@@ -0,0 +1,151 @@
+/* DatabaseJTree.java
+ *
+ * created: October 2006
+ *
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2006  Genome Research Limited
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or(at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+*/
+
+package uk.ac.sanger.artemis.components.database;
+
+
+import java.awt.Point;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DragSourceDragEvent;
+import java.awt.dnd.DragSourceDropEvent;
+import java.awt.dnd.DragSourceEvent;
+import java.awt.dnd.DragSourceListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JTree;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+
+/**
+*
+* File node for local file tree manager
+*
+*/
+public class DatabaseJTree extends JTree
+               implements DragGestureListener,
+                          DragSourceListener
+{
+    /**
+    *
+    * @param file file node file
+    *
+    */
+    public DatabaseJTree(DatabaseTreeNode rootNode)
+    { 
+      super(rootNode);
+      getSelectionModel().setSelectionMode(
+          TreeSelectionModel.SINGLE_TREE_SELECTION);
+      
+      
+      DragSource dragSource = DragSource.getDefaultDragSource();
+
+      dragSource.createDefaultDragGestureRecognizer(
+         this,                             // component where drag originates
+         DnDConstants.ACTION_COPY_OR_MOVE, // actions
+         this);                            // drag gesture recognizer   
+    }
+
+    private boolean isLeafSelection()
+    {
+      TreePath path = getLeadSelectionPath();
+      if(path == null)
+        return false;
+
+      DatabaseTreeNode node = (DatabaseTreeNode)path.getLastPathComponent();
+      return node.isLeaf();
+    }
+    
+    private DatabaseTreeNode getSelectedNode()
+    {
+      TreePath path = getLeadSelectionPath();
+      if(path == null)
+        return null;
+
+      return (DatabaseTreeNode)path.getLastPathComponent();
+    }
+    
+    public void dragGestureRecognized(DragGestureEvent dge)
+    {
+      // ignore if mouse popup trigger
+      InputEvent ie = dge.getTriggerEvent();
+      if(ie instanceof MouseEvent)
+        if(((MouseEvent)ie).isPopupTrigger())
+          return;
+     
+      // drag only files 
+      if(isLeafSelection())
+      {
+        final int nlist = getSelectionCount();
+        if(nlist > 1)
+        {
+
+        }
+        else
+        {
+          dge.startDrag(DragSource.DefaultCopyDrop,     // cursor
+                      null,
+                      new Point(0,0),
+                      (Transferable)getSelectedNode(), // transferable data
+                                            this);     // drag source listener
+        }
+      }
+      
+    }
+
+    public void dragDropEnd(DragSourceDropEvent dsde)
+    {
+      // TODO Auto-generated method stub
+      
+    }
+
+    public void dragEnter(DragSourceDragEvent dsde)
+    {
+      // TODO Auto-generated method stub
+      
+    }
+
+    public void dragExit(DragSourceEvent dse)
+    {
+      // TODO Auto-generated method stub
+      
+    }
+
+    public void dragOver(DragSourceDragEvent dsde)
+    {
+      // TODO Auto-generated method stub
+      
+    }
+
+    public void dropActionChanged(DragSourceDragEvent dsde)
+    {
+      // TODO Auto-generated method stub
+      
+    }
+}
diff --git a/uk/ac/sanger/artemis/components/database/DatabaseTreeNode.java b/uk/ac/sanger/artemis/components/database/DatabaseTreeNode.java
new file mode 100644
index 0000000000000000000000000000000000000000..631d22590761d84c40d4cd55ff781aa906689e80
--- /dev/null
+++ b/uk/ac/sanger/artemis/components/database/DatabaseTreeNode.java
@@ -0,0 +1,127 @@
+/* DatabaseTreeNode.java
+ *
+ * created: October 2006
+ *
+ * This file is part of Artemis
+ *
+ * Copyright(C) 2006  Genome Research Limited
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or(at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+*/
+
+package uk.ac.sanger.artemis.components.database;
+
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import java.io.Serializable;
+import java.io.IOException;
+
+/**
+*
+* File node for local file tree manager
+*
+*/
+public class DatabaseTreeNode extends DefaultMutableTreeNode 
+                 implements Transferable, Serializable
+{
+  /** data flavour of a database node */
+  //public static DataFlavor DATABASETREENODE =
+  //       new DataFlavor(DatabaseTreeNode.class, "Database Node");
+  /** flavours database node and string */
+  //static DataFlavor flavors[] = { DATABASETREENODE, DataFlavor.stringFlavor };
+  
+  public static final DataFlavor DATABASETREENODE = 
+          new DataFlavor(DatabaseTreeNode.class, "Work Package");
+  public static final DataFlavor STRING_DATA_FLAVOUR = 
+          new DataFlavor(String.class, "text/plain");
+  private static final DataFlavor flavors[] = { DATABASETREENODE};
+  
+  
+  private DatabaseEntrySource entrySource;
+  private String featureId;
+  private String schema;
+    
+  public DatabaseTreeNode(final String name, 
+                          final DatabaseEntrySource entrySource)
+  { 
+    super(name);
+    this.entrySource = entrySource;
+  }
+
+  public DatabaseTreeNode(final String name, 
+                          final DatabaseEntrySource entrySource,
+                          final String featureId,
+                          final String schema)
+  { 
+    super(name);
+    this.entrySource = entrySource;
+    this.featureId   = featureId;
+    this.schema      = schema;
+  }
+    
+// Transferable
+  public DataFlavor[] getTransferDataFlavors()
+  {
+    return flavors;
+  }
+
+  public boolean isDataFlavorSupported(DataFlavor f)
+  {
+    if(f.equals(DATABASETREENODE) || f.equals(DataFlavor.stringFlavor))
+      return true;
+    return false;
+  }
+
+  public Object getTransferData(DataFlavor d)
+        throws UnsupportedFlavorException, IOException
+  {
+    if(d.equals(DATABASETREENODE))
+      return this;
+    else throw new UnsupportedFlavorException(d);
+  }
+
+
+  public DatabaseEntrySource getEntrySource()
+  {
+    return entrySource;
+  }
+
+  public String getFeatureId()
+  {
+    return featureId;
+  }
+
+  public String getSchema()
+  {
+    return schema;
+  }
+  
+//Serializable
+  private void writeObject(java.io.ObjectOutputStream out) throws IOException
+  {
+    out.defaultWriteObject();
+  }
+
+  private void readObject(java.io.ObjectInputStream in)
+    throws IOException, ClassNotFoundException
+  {
+    in.defaultReadObject();
+  }
+
+}
diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneEdit.java b/uk/ac/sanger/artemis/components/genebuilder/GeneEdit.java
index d3d691cb21e083a7ee85bb8aba7d1f2021d64b73..f58c232f4dd3ebfac5aa918e1cd1183b738ba23b 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/GeneEdit.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/GeneEdit.java
@@ -54,7 +54,7 @@ import uk.ac.sanger.artemis.io.DatabaseDocumentEntry;
 import uk.ac.sanger.artemis.io.EntryInformationException;
 import uk.ac.sanger.artemis.io.GFFStreamFeature;
 import uk.ac.sanger.artemis.util.DatabaseDocument;
-import uk.ac.sanger.artemis.components.DatabaseEntrySource;
+import uk.ac.sanger.artemis.components.database.DatabaseEntrySource;
 
 
 /**
diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index fa7a9f22a2ead6a38436975ec9228473899f12c3..624ed01bedc618e2c8ff192487cfea236ccbd034 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -32,7 +32,7 @@ import uk.ac.sanger.artemis.chado.IBatisDAO;
 import uk.ac.sanger.artemis.chado.JdbcDAO;
 import uk.ac.sanger.artemis.chado.GmodDAO;
 import uk.ac.sanger.artemis.chado.ChadoTransaction;
-import uk.ac.sanger.artemis.components.DatabaseEntrySource;
+import uk.ac.sanger.artemis.components.database.DatabaseEntrySource;
 
 import org.gmod.schema.sequence.Feature;
 import org.gmod.schema.sequence.FeatureProp;