diff --git a/uk/ac/sanger/artemis/chado/JdbcDAO.java b/uk/ac/sanger/artemis/chado/JdbcDAO.java
index 81aeb5131b55e6c4f031d97fa53526890fa72eba..7487a6778ce75458137df2893066232be946e2b3 100644
--- a/uk/ac/sanger/artemis/chado/JdbcDAO.java
+++ b/uk/ac/sanger/artemis/chado/JdbcDAO.java
@@ -33,6 +33,7 @@ import java.util.Vector;
 
 import org.gmod.schema.sequence.Feature;
 import org.gmod.schema.sequence.FeatureCvTerm;
+import org.gmod.schema.sequence.FeatureCvTermProp;
 import org.gmod.schema.sequence.FeatureDbXRef;
 import org.gmod.schema.sequence.FeatureProp;
 import org.gmod.schema.sequence.Synonym;
@@ -42,6 +43,7 @@ import org.gmod.schema.sequence.FeatureSynonym;
 import org.gmod.schema.general.DbXRef;
 import org.gmod.schema.organism.Organism;
 import org.gmod.schema.cv.CvTerm;
+import org.gmod.schema.cv.Cv;
 import org.gmod.schema.general.Db;
 import org.gmod.schema.pub.Pub;
 
@@ -186,7 +188,7 @@ public class JdbcDAO extends GmodDAO
     String sql = 
        "SELECT feature_id, fc.feature_cvterm_id, is_not AS not, "+
        "pub_id, fc.cvterm_id, fcp.type_id, fcp.value, fcp.rank, "+
-       "db.name, dbxref.accession "+
+       "c.name AS cvterm_name, db.name, dbxref.accession "+
        "FROM feature_cvterm fc "+
        "LEFT JOIN feature_cvtermprop fcp ON fc.feature_cvterm_id=fcp.feature_cvterm_id " +
        "LEFT JOIN cvterm c ON fc.cvterm_id=c.cvterm_id " +
@@ -197,6 +199,8 @@ public class JdbcDAO extends GmodDAO
       sql = sql + " WHERE "+
         "feature_id=(SELECT feature_id FROM feature WHERE uniquename=#uniqueName#)";
     
+    sql = sql + " ORDER BY fcp.feature_cvterm_id, fcp.rank";
+    
     appendToLogFile(sql, sqlLog);
 
     try
@@ -220,6 +224,7 @@ public class JdbcDAO extends GmodDAO
         
         CvTerm cvterm = new CvTerm();
         cvterm.setCvTermId(rs.getInt("cvterm_id"));
+        cvterm.setName(rs.getString("cvterm_name"));
         
         DbXRef dbxref = new DbXRef();
         dbxref.setAccession(rs.getString("accession"));   
@@ -235,28 +240,34 @@ public class JdbcDAO extends GmodDAO
         List featureCvTermProps = new Vector();
         
         int next_feature_cvterm_id = -1;
+        int rank;
+        int next_rank = -1;
+        
         int feature_cvterm_id = rs.getInt("feature_cvterm_id");
         do
         {
-          FeatureProp featureProp = new FeatureProp();
+          rank = rs.getInt("rank");
+          FeatureCvTermProp featureProp = new FeatureCvTermProp();
           CvTerm featurePropCvTerm = new CvTerm();
           featurePropCvTerm.setCvTermId(rs.getInt("type_id"));
           featureProp.setCvTerm(featurePropCvTerm);
           featureProp.setValue(rs.getString("value"));
-          featureProp.setRank(rs.getInt("rank"));
+          featureProp.setRank(rank);
           
           featureCvTermProps.add(featureProp);
           
           if(rs.next())
           {
             next_feature_cvterm_id = rs.getInt("feature_cvterm_id");
-            if(feature_cvterm_id != next_feature_cvterm_id)
+            next_rank = rs.getInt("rank");
+            if(feature_cvterm_id != next_feature_cvterm_id ||
+               next_rank != rank)
               rs.previous();
           }
           else
             next_feature_cvterm_id = -1;
 
-        } while(feature_cvterm_id == next_feature_cvterm_id);
+        } while(feature_cvterm_id == next_feature_cvterm_id && rank == next_rank);
 
         feature_cvterm.setFeatureCvTermProps(featureCvTermProps);
         featureCvTerms.add(feature_cvterm);
@@ -305,7 +316,8 @@ public class JdbcDAO extends GmodDAO
    */
   public List getFeatureDbXRefsByFeatureUniquename(final String uniqueName)
   {
-    String sql = "SELECT db.name, dbx.accession, f.feature_id FROM "
+    String sql = "SELECT db.name, dbx.accession, dbx.version, dbx.description, "
+        + "dbx_f.feature_id, dbx_f.is_current FROM "
         + "feature_dbxref dbx_f "
         + "LEFT JOIN dbxref dbx ON dbx.dbxref_id=dbx_f.dbxref_id "
         + "LEFT JOIN db ON db.db_id=dbx.db_id "
@@ -314,6 +326,8 @@ public class JdbcDAO extends GmodDAO
     if(uniqueName != null)
       sql = sql + "WHERE f.uniquename='" + uniqueName + "'";
 
+    sql = sql + " ORDER BY f.type_id,  uniquename";
+    
     appendToLogFile(sql, sqlLog);
 
     try
@@ -329,11 +343,14 @@ public class JdbcDAO extends GmodDAO
         Db db = new Db();
         db.setName(rs.getString("name"));
         dbxref.setAccession(rs.getString("accession"));
+        dbxref.setVersion(rs.getString("version"));
+        dbxref.setDescription(rs.getString("description"));
         dbxref.setDb(db);
         Feature feat = new Feature();
         feat.setFeatureId(rs.getInt("feature_id"));
         feature_dbxref.setDbXRef(dbxref);
         feature_dbxref.setFeature(feat);
+        feature_dbxref.setCurrent(rs.getBoolean("is_current"));
         dbxrefs.add(feature_dbxref);
       }
 
@@ -586,33 +603,43 @@ public class JdbcDAO extends GmodDAO
         do
         {
           // feature properties
-          FeatureProp featureprop = new FeatureProp();
-          CvTerm cvterm = new CvTerm();
-          cvterm.setCvTermId(rs.getInt("prop_type_id"));
-          featureprop.setCvTerm(cvterm);
-          featureprop.setValue(rs.getString("value"));
+          int prop_type_id = rs.getInt("prop_type_id");
+          
+          if(prop_type_id != 0)
+          {
+            FeatureProp featureprop = new FeatureProp();
+            CvTerm cvterm = new CvTerm();
+            cvterm.setCvTermId(prop_type_id);
+            featureprop.setCvTerm(cvterm);
+            featureprop.setValue(rs.getString("value"));
+
+            if(feature.getFeatureProps() == null
+                || feature.getFeatureProps().size() == 0)
+              feature.setFeatureProps(new Vector());
+            feature.addFeatureProp(featureprop);
+          }
           
-          if(feature.getFeatureProps() == null ||
-             feature.getFeatureProps().size() == 0)
-            feature.setFeatureProps(new Vector());
-          feature.addFeatureProp(featureprop);
-
           // feature relationship
           FeatureRelationship feature_relationship = new FeatureRelationship();
-          cvterm = new CvTerm();
+          CvTerm cvterm = new CvTerm();
           cvterm.setCvTermId(rs.getInt("relation_type_id"));
           feature_relationship.setCvTerm(cvterm);
 
-          Feature object = new Feature();
-          object.setFeatureId(rs.getInt("object_id"));
-          feature_relationship.setFeatureByObjectId(object);
+          int obj_id = rs.getInt("object_id");
           
-          if(feature.getFeatureRelationshipsForSubjectId() == null ||
-             feature.getFeatureRelationshipsForSubjectId().size() == 0)
-            feature.setFeatureRelationshipsForSubjectId(new Vector());
+          if(obj_id != 0)
+          {
+            Feature object = new Feature();
+            object.setFeatureId(obj_id);
+            feature_relationship.setFeatureByObjectId(object);
+
+            if(feature.getFeatureRelationshipsForSubjectId() == null
+                || feature.getFeatureRelationshipsForSubjectId().size() == 0)
+              feature.setFeatureRelationshipsForSubjectId(new Vector());
+
+            feature.addFeatureRelationshipsForSubjectId(feature_relationship);
+          }
           
-          feature.addFeatureRelationshipsForSubjectId(feature_relationship);
-        
           if(!rs.isLast())
           {
             rs.next();
@@ -787,7 +814,7 @@ public class JdbcDAO extends GmodDAO
    */
   public List getCvTerms()
   {
-    String sql = "SELECT cvterm.cvterm_id, cvterm.name " +
+    String sql = "SELECT cvterm.cvterm_id, cvterm.name as cvterm_name, cv.NAME as cv_name " +
                  "FROM cvterm, cv WHERE cv.cv_id = cvterm.cv_id";
 
     appendToLogFile(sql, sqlLog);
@@ -802,7 +829,10 @@ public class JdbcDAO extends GmodDAO
       {
         CvTerm cvterm = new CvTerm();
         cvterm.setCvTermId(rs.getInt("cvterm_id"));
-        cvterm.setName(rs.getString("name"));
+        cvterm.setName(rs.getString("cvterm_name"));
+        Cv cv = new Cv();
+        cv.setName(rs.getString("cv_name"));
+        cvterm.setCv(cv);
         cvterms.add(cvterm);
       }
       return cvterms;
diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index 388ebb867df114d5a625eb7af7e5aa707109c865..e5d60556c64c9b2e55e2d24af0ff1c7a8c168529 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -40,6 +40,7 @@ import org.gmod.schema.sequence.FeatureLoc;
 import org.gmod.schema.sequence.FeatureRelationship;
 import org.gmod.schema.sequence.FeatureSynonym;
 import org.gmod.schema.sequence.FeatureCvTerm;
+import org.gmod.schema.sequence.FeatureCvTermProp;
 import org.gmod.schema.cv.CvTerm;
 import org.gmod.schema.general.DbXRef;
 import org.gmod.schema.organism.Organism;
@@ -797,7 +798,8 @@ public class DatabaseDocument extends Document
     //this_buff.append("feature_id="+feature_id+";");
     
     // attributes
-    if(feat.getFeatureProps() != null)
+    if(feat.getFeatureProps() != null &&
+       feat.getFeatureProps().size() > 0)
     {
       List featureprops = (List)feat.getFeatureProps();
       for(int j=0; j<featureprops.size(); j++)
@@ -853,12 +855,49 @@ public class DatabaseDocument extends Document
       {
         feature_cvterm = (FeatureCvTerm)v_feature_cvterms.get(j);
         
+        CvTerm cvterm =  getCvTerm( feature_cvterm.getCvTerm().getCvTermId(), dao);
         DbXRef dbXRef = feature_cvterm.getCvTerm().getDbXRef();
-              
-        this_buff.append("GO=");
-        if(feature_cvterm.isNot())
-          this_buff.append("qualifier=NOT;");
-        this_buff.append(dbXRef.getDb().getName()+":"+dbXRef.getAccession()+";");       
+          
+        if(cvterm.getCv().getName().equals("genedb_controlledcuration"))
+        {
+          int cvtermId  = feature_cvterm.getCvTerm().getCvTermId();
+          String cvName = getCvTerm(cvtermId, dao).getCv().getName();
+          
+          this_buff.append("controlled_curation=");
+          this_buff.append("cv="+cvName+"%3B");
+          this_buff.append("term="+feature_cvterm.getCvTerm().getName()+"%3B");
+          this_buff.append("db_xref="+dbXRef.getDb().getName() + ":"
+              + dbXRef.getAccession() + "%3B");
+          
+          List feature_cvtermprops = (List)feature_cvterm.getFeatureCvTermProps();
+          for(int i=0; i<feature_cvtermprops.size(); i++)
+          {
+            FeatureCvTermProp feature_cvtermprop = (FeatureCvTermProp)feature_cvtermprops.get(i);
+            this_buff.append(getCvtermName(feature_cvtermprop.getCvTerm().getCvTermId(), dao));
+            this_buff.append("=");
+            this_buff.append(feature_cvtermprop.getValue());
+            if(i<feature_cvtermprops.size())
+              this_buff.append("%3B");
+          }
+          this_buff.append(";");
+        }
+        else
+        {
+          this_buff.append("GO=");
+
+          if(cvterm.getCv().getName().equals("molecular_function"))
+            this_buff.append("aspect=F%3B");
+          else if(cvterm.getCv().getName().equals("cellular_component"))
+            this_buff.append("aspect=C%3B");
+          else if(cvterm.getCv().getName().equals("biological_process"))
+            this_buff.append("aspect=P%3B");
+
+          if(feature_cvterm.isNot())
+            this_buff.append("qualifier=NOT%3B");
+
+          this_buff.append("GOid="+dbXRef.getDb().getName() + ":"
+              + dbXRef.getAccession() + ";"); 
+        }
       }
       //System.out.println(new String(this_buff.getBytes()));
     }
@@ -890,11 +929,16 @@ public class DatabaseDocument extends Document
    * @return    the cvterm name
    */
   private static String getCvtermName(long id, GmodDAO dao)
+  {
+    return getCvTerm(id, dao).getName();
+  }
+  
+  private static CvTerm getCvTerm(long id, GmodDAO dao)
   {
     if(cvterms == null)
-      getCvterm(dao);
+      getCvterms(dao);
 
-    return ((CvTerm)cvterms.get(new Long(id))).getName();
+    return (CvTerm)cvterms.get(new Long(id));
   }
 
   /**
@@ -902,7 +946,7 @@ public class DatabaseDocument extends Document
    * @param dao the data access object
    * @return    the cvterm <code>Hashtable</code>
    */
-  private static Hashtable getCvterm(GmodDAO dao)
+  private static Hashtable getCvterms(GmodDAO dao)
   {
     cvterms = new Hashtable();