diff --git a/uk/ac/sanger/artemis/chado/ChadoDemo.java b/uk/ac/sanger/artemis/chado/ChadoDemo.java
index 18a3b961c0ae2e10c813f34fc9c3411c10a9395f..2c62eb138ff4034c69c2276d6f9f1b8a5248af62 100644
--- a/uk/ac/sanger/artemis/chado/ChadoDemo.java
+++ b/uk/ac/sanger/artemis/chado/ChadoDemo.java
@@ -25,13 +25,8 @@
 package uk.ac.sanger.artemis.chado;
 
 import org.gmod.schema.cv.CvTerm;
-import org.gmod.schema.general.DbXRef;
-import org.gmod.schema.pub.Pub;
-import org.gmod.schema.pub.PubDbXRef;
 import org.gmod.schema.sequence.Feature;
 import org.gmod.schema.sequence.FeatureCvTerm;
-import org.gmod.schema.sequence.FeatureCvTermDbXRef;
-import org.gmod.schema.sequence.FeatureCvTermProp;
 import org.gmod.schema.sequence.FeatureDbXRef;
 import org.gmod.schema.sequence.FeatureSynonym;
 import org.gmod.schema.sequence.FeatureProp;
@@ -51,6 +46,7 @@ import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Collection;
 import java.util.Vector;
 
 import javax.swing.JLabel;
@@ -118,6 +114,8 @@ public class ChadoDemo
    */
   public ChadoDemo()
   {
+    uk.ac.sanger.artemis.components.Splash.initLogger();
+    
     try
     {
       setLocation();
@@ -315,7 +313,8 @@ public class ChadoDemo
     List attributes = (List)chado_feature.getFeatureProps();
     List dbxrefs = dao.getFeatureDbXRefsByFeatureUniquename(uniquename);
     List featureCvTerms       = dao.getFeatureCvTermsByFeature(chado_feature);
-    List featureCvTermDbXRefs = dao.getFeatureCvTermDbXRef(chado_feature);
+    List featureCvTermDbXRefs = dao.getFeatureCvTermDbXRefByFeature(chado_feature);
+    List featureCvTermPubs    = dao.getFeatureCvTermPubByFeature(chado_feature);
     
     if(dbxrefs.size() > 0)
     {
@@ -329,7 +328,7 @@ public class ChadoDemo
       attr_buff.append("\n");
     }
 
-    List synonyms = (List)chado_feature.getFeatureSynonyms();
+    Collection synonyms = chado_feature.getFeatureSynonyms();
 
     // append synonyms
     if(synonyms != null && synonyms.size() > 0)
@@ -337,10 +336,10 @@ public class ChadoDemo
       FeatureSynonym alias;
 
       System.out.println("\n\nNow get synonym & type_id.......\n\n");
-      
-      for(int i = 0; i < synonyms.size(); i++)
+      Iterator it = synonyms.iterator();
+      while(it.hasNext())
       {
-        alias = (FeatureSynonym) synonyms.get(i);
+        alias = (FeatureSynonym)it.next();
         attr_buff.append("/");
         attr_buff.append(alias.getSynonym().getCvTerm().getName() + "=");
         attr_buff.append(alias.getSynonym().getName());
@@ -351,14 +350,17 @@ public class ChadoDemo
     }
 
     if(attributes != null)
-      for(int i = 0; i < attributes.size(); i++)
+    {
+      Iterator it = attributes.iterator();
+      while(it.hasNext())
       {
-        FeatureProp featprop = (FeatureProp) attributes.get(i);
+        FeatureProp featprop = (FeatureProp)it.next();
 
         attr_buff.append("/" + featprop.getCvTerm().getName() + "="
             + GFFStreamFeature.decode(featprop.getValue()) + "\n");
       }
-
+    }
+    
     if(featureCvTerms != null)
     {
       for(int j=0; j<featureCvTerms.size(); j++)
@@ -367,7 +369,7 @@ public class ChadoDemo
         FeatureCvTerm feature_cvterm = (FeatureCvTerm)featureCvTerms.get(j);
 
         DatabaseDocument.appendControlledVocabulary(attr_buff, dao, feature_cvterm,
-            featureCvTermDbXRefs, pubDbXRefs);
+            featureCvTermDbXRefs, featureCvTermPubs, pubDbXRefs);
         
         attr_buff.append("\n");
       }
@@ -412,11 +414,12 @@ public class ChadoDemo
       feature = (Feature) featureList.get(i);
       
       // assume only one featureloc
-      List locs = (List)feature.getFeatureLocsForFeatureId();
+      Collection locs = feature.getFeatureLocsForFeatureId();
       
       if(locs != null && locs.size() > 0)
       {
-        FeatureLoc loc = (FeatureLoc)locs.get(0);
+        Iterator it = locs.iterator();
+        FeatureLoc loc = (FeatureLoc)it.next();
         int fmin = loc.getFmin().intValue() + 1;
         int fmax = loc.getFmax().intValue();
         rowData[i][4] = fmin + "..." + fmax;
diff --git a/uk/ac/sanger/artemis/chado/GmodDAO.java b/uk/ac/sanger/artemis/chado/GmodDAO.java
index b5ce43ab648910551c853e0ba36d87225fa74030..b0480f07155e525089da76fe625f92822387be39 100644
--- a/uk/ac/sanger/artemis/chado/GmodDAO.java
+++ b/uk/ac/sanger/artemis/chado/GmodDAO.java
@@ -45,7 +45,9 @@ public abstract class GmodDAO implements SequenceDaoI, SchemaDaoI, OrganismDaoI,
 
   public abstract List getPubDbXRef();
   
-  public abstract List getFeatureCvTermDbXRef(Feature feature);
+  public abstract List getFeatureCvTermDbXRefByFeature(Feature feature);
+  
+  public abstract List getFeatureCvTermPubByFeature(Feature feature);
   
   /**
    * Return the list of all feature_synonyms as Feature.featureSynonyms 
diff --git a/uk/ac/sanger/artemis/chado/IBatisDAO.java b/uk/ac/sanger/artemis/chado/IBatisDAO.java
index 2d7b15891a1e71fbf867aa77f4fe62b7fb54cab4..742ac5edf1a2dc20de29a8d3063da4d5ad06d40f 100644
--- a/uk/ac/sanger/artemis/chado/IBatisDAO.java
+++ b/uk/ac/sanger/artemis/chado/IBatisDAO.java
@@ -305,11 +305,16 @@ public class IBatisDAO extends GmodDAO
   }
   
   
-  public List getFeatureCvTermDbXRef(Feature feature)
+  public List getFeatureCvTermDbXRefByFeature(Feature feature)
   {
     return sqlMap.queryForList("getFeatureCvTermDbXRef", feature);
   }
   
+  public List getFeatureCvTermPubByFeature(Feature feature)
+  {
+    return sqlMap.queryForList("getFeatureCvTermPub", feature);
+  }
+  
   public List getProducts()
   {
     return null;  
diff --git a/uk/ac/sanger/artemis/chado/JdbcDAO.java b/uk/ac/sanger/artemis/chado/JdbcDAO.java
index a3ef5e23589c5f2a825e250f08acf029c66991df..f9c6e14c4c2001473c4ff6d71d44a9c53843f30c 100644
--- a/uk/ac/sanger/artemis/chado/JdbcDAO.java
+++ b/uk/ac/sanger/artemis/chado/JdbcDAO.java
@@ -41,6 +41,7 @@ import org.gmod.schema.sequence.FeatureLoc;
 import org.gmod.schema.sequence.FeatureRelationship;
 import org.gmod.schema.sequence.FeatureSynonym;
 import org.gmod.schema.sequence.FeatureCvTermDbXRef;
+import org.gmod.schema.sequence.FeatureCvTermPub;
 import org.gmod.schema.general.DbXRef;
 import org.gmod.schema.organism.Organism;
 import org.gmod.schema.cv.CvTerm;
@@ -231,6 +232,9 @@ public class JdbcDAO extends GmodDAO
         CvTerm cvterm = new CvTerm();
         cvterm.setCvTermId(rs.getInt("cvterm_id"));
         cvterm.setName(rs.getString("cvterm_name"));
+        Cv cv = new Cv();
+        cv.setName(rs.getString("cv_name"));
+        cvterm.setCv(cv);
         
         DbXRef dbxref = new DbXRef();
         dbxref.setAccession(rs.getString("accession"));   
@@ -254,6 +258,8 @@ public class JdbcDAO extends GmodDAO
         int next_fc_rank = -1;      
         int next_feature_cvterm_id = -1;  
         int feature_cvterm_id = rs.getInt("feature_cvterm_id");
+        feature_cvterm.setFeatureCvTermId(feature_cvterm_id);
+        
         do
         {
           FeatureCvTermProp featureProp = new FeatureCvTermProp();
@@ -576,7 +582,7 @@ public class JdbcDAO extends GmodDAO
     return null;
   }
   
-  public List getFeatureCvTermDbXRef(Feature feature)
+  public List getFeatureCvTermDbXRefByFeature(Feature feature)
   { 
     String sql = "SELECT fcd.feature_cvterm_id, dbx.*, db.name "+
       "FROM feature_cvterm_dbxref fcd "+
@@ -626,6 +632,48 @@ public class JdbcDAO extends GmodDAO
     }
   }
   
+  public List getFeatureCvTermPubByFeature(Feature feature)
+  {
+    String sql = "SELECT fcp.feature_cvterm_id, pub.* " +
+                 "FROM feature_cvterm_pub fcp " +
+                 "LEFT JOIN pub ON fcp.pub_id=pub.pub_id ";
+    
+    if(feature != null && feature.getUniqueName() != null)
+      sql = sql+ " " +
+          "LEFT JOIN feature_cvterm fc ON fcp.feature_cvterm_id=fc.feature_cvterm_id "+
+          "WHERE feature_id=(SELECT feature_id FROM feature WHERE uniquename='"+
+          feature.getUniqueName()+"')";
+    
+    appendToLogFile(sql, sqlLog);
+    
+    try
+    {
+      Statement st = conn.createStatement();
+      ResultSet rs = st.executeQuery(sql);
+      List featureCvTermPubs = new Vector();
+      FeatureCvTermPub featureCvTermPub;
+      while(rs.next())
+      {
+        featureCvTermPub = new FeatureCvTermPub();
+        FeatureCvTerm featureCvTerm = new FeatureCvTerm();
+        featureCvTerm.setFeatureCvTermId( rs.getInt("feature_cvterm_id") );
+        featureCvTermPub.setFeatureCvTerm(featureCvTerm);
+        
+        Pub pub = new Pub();
+        pub.setUniqueName(rs.getString("uniquename"));
+        
+        featureCvTermPub.setPub(pub);
+        featureCvTermPubs.add(featureCvTermPub);
+      }
+      
+      return featureCvTermPubs;
+    }
+    catch(SQLException sqle)
+    {
+      throw new RuntimeException(sqle);
+    }
+  }
+  
   public List getProducts()
   {
     return null;  
@@ -748,6 +796,8 @@ public class JdbcDAO extends GmodDAO
               feature.setFeatureProps(new Vector());
             feature.addFeatureProp(featureprop);
           }
+          else 
+            feature.setFeatureProps(new Vector(0));
           
           // feature relationship
           FeatureRelationship feature_relationship = new FeatureRelationship();
@@ -769,6 +819,8 @@ public class JdbcDAO extends GmodDAO
 
             feature.addFeatureRelationshipsForSubjectId(feature_relationship);
           }
+          else
+            feature.setFeatureRelationshipsForSubjectId(new Vector(0));
           
           if(!rs.isLast())
           {
@@ -1051,7 +1103,8 @@ public class JdbcDAO extends GmodDAO
         pubDbXRef = new PubDbXRef();
         Pub pub = new Pub();
         pub.setPubId(rs.getInt("pub_id"));
-         
+        pubDbXRef.setPub(pub);
+        
         DbXRef dbXRef = new DbXRef();
         dbXRef.setAccession(rs.getString("accession"));
         dbXRef.setDescription(rs.getString("description"));