diff --git a/artemis_sqlmap/Feature.xml b/artemis_sqlmap/Feature.xml
index 4a837149f034adf993b10e9f074501da7a674002..de00ed9bf1344b9874361600e50c1f6643628b43 100644
--- a/artemis_sqlmap/Feature.xml
+++ b/artemis_sqlmap/Feature.xml
@@ -72,7 +72,8 @@
                                            select="getFeatureRelationship" /> 
         <result property="featureSynonyms" column="{feature.uniqueName=uniqueName}" 
                                            select="getLazyFeatureSynonymsByUniquename" />                          
-        <result property="organism" column="organism_id" select="getOrganism" />
+        <result property="organism" column="{organismId=organismId}" 
+                                    select="getOrganism" />
      </resultMap>
      
     
@@ -207,7 +208,7 @@
 	    timelastmodified,
 	 	f.feature_id AS id,
 	 	uniquename,
-	 	organism_id,
+	 	organism_id AS organismId,
 		name,
 	 	f.type_id,
 		seqlen AS length,
@@ -243,7 +244,7 @@
     <select id="getResidueType" parameterClass="java.lang.String" 
             resultClass="java.lang.Long">
        SELECT DISTINCT type_id 
-       FROM $value$.feature 
+       FROM feature 
        WHERE residues notnull
     </select>
 
@@ -256,8 +257,8 @@
          uniquename,
          feature_id,
          type_id
-       FROM organism, $schema$.feature WHERE
-         organism.organism_id=$schema$.feature.organism_id AND
+       FROM organism, feature WHERE
+         organism.organism_id=feature.organism_id AND
          residues notnull
          <iterate prepend="AND" property="cvTermIds" conjunction="OR" open="(" close=")">
            type_id=#cvTermIds[]#
diff --git a/artemis_sqlmap/Organism.xml b/artemis_sqlmap/Organism.xml
index 7aa505065d92994a2cf9c2b9c2cd0b27da1feca1..cc8c9d32d76acc3cc2d893b7674524fd4627c4f5 100644
--- a/artemis_sqlmap/Organism.xml
+++ b/artemis_sqlmap/Organism.xml
@@ -6,10 +6,19 @@
  
 <sqlMap namespace="Organism"> 
       
-    <select id="getOrganism" resultClass="org.gmod.schema.organism.Organism"> 
-      SELECT organism_id AS organismId, abbreviation, genus, species, common_name, comment 
+    <select id="getOrganism"
+     resultClass="org.gmod.schema.organism.Organism"> 
+      SELECT organism_id AS organismId, abbreviation, genus, species, common_name AS commonName, comment 
       FROM organism
-      WHERE organism_id=#value# 
+      <dynamic>
+        <isNotNull prepend="WHERE" property="organismId">
+           organism_id=#organismId#
+        </isNotNull>
+        
+        <isNull prepend="ORDER BY" property="organismId">
+           commonName
+        </isNull>
+      </dynamic>
     </select> 
  
 </sqlMap> 
diff --git a/uk/ac/sanger/artemis/chado/ChadoDAO.java b/uk/ac/sanger/artemis/chado/ChadoDAO.java
index 881248c2fdb96f5791fe47223c38c10c98c1ccb4..af1c178e0f727a3abded3512fdcb34ddb805221d 100644
--- a/uk/ac/sanger/artemis/chado/ChadoDAO.java
+++ b/uk/ac/sanger/artemis/chado/ChadoDAO.java
@@ -164,6 +164,8 @@ public interface ChadoDAO
   public FeatureCvTerm getFeatureCvTermByFeatureAndCvTerm(Feature feature,
           CvTerm cvTerm, boolean not);
   
+  public List getOrganisms();
+
 //
 // WRITE BACK
 //
diff --git a/uk/ac/sanger/artemis/chado/IBatisDAO.java b/uk/ac/sanger/artemis/chado/IBatisDAO.java
index 5f9b89370314fdd62e3f03adee3fbed2b79b97b3..017b335628bbedf1938116faa8585c797c355f8f 100644
--- a/uk/ac/sanger/artemis/chado/IBatisDAO.java
+++ b/uk/ac/sanger/artemis/chado/IBatisDAO.java
@@ -298,6 +298,11 @@ public class IBatisDAO implements ChadoDAO
     return null;
   }
   
+  public List getOrganisms()
+  {
+    return sqlMap.queryForList("getOrganism", null);
+  }
+  
 //
 // WRITE BACK
 //
diff --git a/uk/ac/sanger/artemis/chado/JdbcDAO.java b/uk/ac/sanger/artemis/chado/JdbcDAO.java
index 2aee5cf0223cf0366d973b2b70e2619203c4a5e9..aed3429db74b690a254e006cae691a3f42920c83 100644
--- a/uk/ac/sanger/artemis/chado/JdbcDAO.java
+++ b/uk/ac/sanger/artemis/chado/JdbcDAO.java
@@ -283,8 +283,12 @@ public class JdbcDAO
                                  final String schema)
   {
     String sql = new String(
-            "SELECT abbreviation, uniquename, name, feature_id, type_id FROM organism, "+
-            schema + ".feature WHERE (");
+            "SELECT abbreviation, uniquename, name, feature_id, type_id FROM organism, ");
+            
+    if(schema != null || !schema.equals(""))
+      sql = sql + schema +"." ;
+    
+    sql = sql + "feature WHERE (";
 
     for(int j = 0; j < cvTermIds.size(); j++)
     {
@@ -293,8 +297,12 @@ public class JdbcDAO
         sql = sql + " OR ";
     }
 
-    sql = sql + ") and organism.organism_id=" + schema
-            + ".feature.organism_id " + "and residues notnull "
+    sql = sql + ") and organism.organism_id=";
+    
+    if(schema != null || !schema.equals(""))
+      sql = sql + schema +"." ;
+    
+    sql = sql + "feature.organism_id " + "and residues notnull "
             + "ORDER BY abbreviation";
 
     appendToLogFile(sql, sqlLog);
@@ -336,8 +344,11 @@ public class JdbcDAO
    */
   public List getResidueType(final String schema)
   {
-    String sql = "SELECT DISTINCT type_id FROM " +schema+
-                 ".feature WHERE residues notnull";
+    String sql = "SELECT DISTINCT type_id FROM ";
+    
+    if(schema != null || !schema.equals(""))
+      sql = sql + schema +"." ;
+    sql = sql + "feature WHERE residues notnull";
     appendToLogFile(sql, sqlLog);
 
     List cvterm_ids = new Vector();
@@ -552,6 +563,40 @@ public class JdbcDAO
   }
   
   
+  public List getOrganisms()
+  {
+    String sql = "SELECT organism_id AS organismId, abbreviation, "+
+      "genus, species, common_name AS commonName, comment "+ 
+      "FROM organism ORDER BY commonName";
+    
+    appendToLogFile(sql, sqlLog);
+    List organisms = new Vector();
+    
+    try
+    {
+      Statement st = conn.createStatement();
+      ResultSet rs = st.executeQuery(sql);
+
+      while(rs.next())
+      {
+        Organism organism = new Organism();
+        organism.setOrganismId(rs.getInt("organismId"));
+        organism.setAbbreviation(rs.getString("abbreviation"));
+        organism.setGenus(rs.getString("genus"));
+        organism.setSpecies(rs.getString("species"));
+        organism.setCommonName(rs.getString("commonName"));
+        organism.setComment(rs.getString("comment"));
+        organisms.add(organism);
+      }
+    }
+    catch(SQLException sqle)
+    {
+      throw new RuntimeException(sqle);
+    }
+    return organisms;
+  }
+  
+  
 //
 // WRITE 
 //
diff --git a/uk/ac/sanger/artemis/components/DatabaseEntrySource.java b/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
index bac513adc6a431af702f85b82a955fd019503fdd..4c05e1b14475f398bea6b33484ff444f35e3ae3e 100644
--- a/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
+++ b/uk/ac/sanger/artemis/components/DatabaseEntrySource.java
@@ -34,6 +34,8 @@ import java.io.*;
 import java.util.*;
 import java.net.ConnectException;
 
+import org.gmod.schema.organism.Organism;
+
 import uk.ac.sanger.artemis.util.*;
 import uk.ac.sanger.artemis.*;
 import uk.ac.sanger.artemis.sequence.*;
@@ -304,14 +306,19 @@ public class DatabaseEntrySource implements EntrySource
 
     final Object v_organism[] = entries.keySet().toArray();
     final int v_organism_size = v_organism.length;
-    Arrays.sort(v_organism);
-
+    Arrays.sort(v_organism);  
+    
     for(int i=0; i<schema.size(); i++)
     {
-      String name = (String)schema.get(i);
+      int nchild = 0;
+      String name;
+      
+      if(schema.get(i) instanceof String)
+        name = (String)schema.get(i);
+      else
+        name = ((Organism)schema.get(i)).getCommonName();
+      
       schema_node = new DefaultMutableTreeNode(name);
-      top.add(schema_node);
-
       Hashtable seq_type_node = new Hashtable();
 
       for(int j = 0; j < v_organism_size; j++)
@@ -336,8 +343,11 @@ public class DatabaseEntrySource implements EntrySource
 
           seq_node = new DefaultMutableTreeNode(seq_name);
           typ_node.add(seq_node);
+          nchild++;
         }
       }
+      if(nchild > 0)
+        top.add(schema_node);
     }
   }
 
diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index 9a9ecded3d72f7344d2c07afb8a87c4427c8646b..792934376836cff178694737f49de04b7dfc39aa 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -39,6 +39,7 @@ import org.gmod.schema.sequence.FeatureLoc;
 import org.gmod.schema.sequence.FeatureRelationship;
 import org.gmod.schema.sequence.FeatureSynonym;
 import org.gmod.schema.cv.CvTerm;
+import org.gmod.schema.organism.Organism;
 
 import java.sql.*;
 import java.text.SimpleDateFormat;
@@ -232,6 +233,7 @@ public class DatabaseDocument extends Document
   private void reset(String location, String schema)
   {
     this.schema = schema;
+
     if(!location.endsWith("="+schema))
     {
       int index = location.lastIndexOf('=');
@@ -976,6 +978,91 @@ public class DatabaseDocument extends Document
   }
   
   
+  /**
+   * Create a hashtable of the available entries with residues.
+   * @return a <code>Hashtable</code> of the <code>String</code>
+   *          representation (schema-type-feature_name) and the
+   *          corresponding feature_id
+   * @throws ConnectException
+   * @throws java.sql.SQLException
+   */
+  public Hashtable getDatabaseEntries2()
+                   throws ConnectException, java.sql.SQLException
+  {
+    db = new Hashtable();
+    String schema = null;
+
+    try
+    { 
+      ChadoDAO dao = null;
+      dao = getDAO();
+      schema_list = dao.getOrganisms();
+      Iterator it = schema_list.iterator();
+
+      while(it.hasNext())
+      {
+        Organism organism = (Organism)it.next();
+        schema = organism.getCommonName();
+        
+        reset((String)getLocation(),  schema);
+        
+        try
+        {
+          dao = getDAO();
+          List list = dao.getResidueType(schema);
+         
+          if(list.size() == 0)  // no residues for this organism
+            continue;
+
+          List list_residue_features = dao.getResidueFeatures(list, schema);
+          Iterator it_residue_features = list_residue_features.iterator();
+          while(it_residue_features.hasNext())
+          {
+            Feature feature = (Feature)it_residue_features.next();
+            String typeName = getCvtermName(feature.getCvTerm().getCvTermId(), getDAO()); 
+          
+            db.put(schema + " - " + typeName + " - " + feature.getUniqueName(),
+                   Integer.toString(feature.getFeatureId()));
+          }
+        }
+        catch(RuntimeException e)
+        { 
+        }
+        catch(java.sql.SQLException sqlExp)
+        {
+        }
+      }
+      
+    }
+    catch(RuntimeException sqlExp)
+    {
+      JOptionPane.showMessageDialog(null, "SQL Problems...\n"+
+                                    sqlExp.getMessage(), 
+                                    "SQL Error",
+                                    JOptionPane.ERROR_MESSAGE);
+      sqlExp.printStackTrace();
+    }
+    catch(ConnectException exp)
+    {
+      JOptionPane.showMessageDialog(null, "Connection Problems...\n"+
+            exp.getMessage(), 
+            "Connection Error",
+            JOptionPane.ERROR_MESSAGE);
+      throw exp;
+    }
+    catch(java.sql.SQLException sqlExp)
+    {
+      JOptionPane.showMessageDialog(null, "SQL Problems....\n"+
+                                    sqlExp.getMessage(), 
+                                    "SQL Error",
+                                    JOptionPane.ERROR_MESSAGE);
+      throw sqlExp;
+    }
+    
+    return db;
+  }
+  
+  
   /**
    * Get the data access object (DAO).
    * @return data access object
@@ -992,7 +1079,10 @@ public class DatabaseDocument extends Document
     else
     {   
       if(connIB == null)
+      {
+        System.setProperty("chado", (String)getLocation());
         connIB = new IBatisDAO(pfield);
+      }
       return connIB;
     }
   }