diff --git a/uk/ac/sanger/artemis/util/DatabaseDocument.java b/uk/ac/sanger/artemis/util/DatabaseDocument.java
index e5d60556c64c9b2e55e2d24af0ff1c7a8c168529..7855330effdcf245aaf13a0993677dcf29ef0f47 100644
--- a/uk/ac/sanger/artemis/util/DatabaseDocument.java
+++ b/uk/ac/sanger/artemis/util/DatabaseDocument.java
@@ -101,6 +101,12 @@ public class DatabaseDocument extends Document
   
   private boolean gene_builder;
   
+  // controlled vocabulary
+  /** controlled_curation controlled vocabulary */
+  private static String CONTROLLED_CURATION_TAG_CVNAME = "CC_genedb_controlledcuration";
+  /** product controlled vocabulary */
+  private static String PRODUCTS_TAG_CVNAME = "genedb_products";
+  
   /**
    * 
    * Create a new Document from a database.
@@ -846,6 +852,7 @@ public class DatabaseDocument extends Document
       }
     }
     
+    // GO, controlled_curation, product
     if(featureCvTerms != null && 
        featureCvTerms.containsKey(feature_id))
     {
@@ -858,14 +865,15 @@ public class DatabaseDocument extends Document
         CvTerm cvterm =  getCvTerm( feature_cvterm.getCvTerm().getCvTermId(), dao);
         DbXRef dbXRef = feature_cvterm.getCvTerm().getDbXRef();
           
-        if(cvterm.getCv().getName().equals("genedb_controlledcuration"))
+        if(cvterm.getCv().getName().equals(CONTROLLED_CURATION_TAG_CVNAME))
         {
           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("cv="+cvName+"%3B");
+          
           this_buff.append("db_xref="+dbXRef.getDb().getName() + ":"
               + dbXRef.getAccession() + "%3B");
           
@@ -881,6 +889,11 @@ public class DatabaseDocument extends Document
           }
           this_buff.append(";");
         }
+        else if(cvterm.getCv().getName().equals(PRODUCTS_TAG_CVNAME))
+        {
+          this_buff.append("product=");
+          this_buff.append(feature_cvterm.getCvTerm().getName()+";");
+        }
         else
         {
           this_buff.append("GO=");
@@ -896,7 +909,24 @@ public class DatabaseDocument extends Document
             this_buff.append("qualifier=NOT%3B");
 
           this_buff.append("GOid="+dbXRef.getDb().getName() + ":"
-              + dbXRef.getAccession() + ";"); 
+              + dbXRef.getAccession() + "%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(";");
         }
       }
       //System.out.println(new String(this_buff.getBytes()));
@@ -940,6 +970,19 @@ public class DatabaseDocument extends Document
 
     return (CvTerm)cvterms.get(new Long(id));
   }
+  
+  public static CvTerm getCvTermByCvTermName(String cvterm_name)
+  {
+    Enumeration enum_cvterm = cvterms.elements();
+    while(enum_cvterm.hasMoreElements())
+    {
+      CvTerm cvterm = (CvTerm)enum_cvterm.nextElement();
+      if(cvterm_name.equals( cvterm.getName() ))
+        return cvterm;
+    }
+    
+    return null;
+  }
 
   /**
    * Look up cvterms names and id and return in a hashtable.