diff --git a/artemis_sqlmap/FeatureCvTerm.xml b/artemis_sqlmap/FeatureCvTerm.xml
index 29d98339a9f85c3cccf7704195dbe574e7d72ae4..85d460842add21578f8217599b03f2861ed35e86 100644
--- a/artemis_sqlmap/FeatureCvTerm.xml
+++ b/artemis_sqlmap/FeatureCvTerm.xml
@@ -22,6 +22,8 @@
         <result property="pub.uniqueName"    column="uniquename" />
         <result property="cvTerm.dbXRef.accession" column="accession" />
         <result property="cvTerm.dbXRef.db.name"   column="name" />
+        <result property="featureCvTermDbXRefs"    column="feature_cvterm_id"
+                                          select="getFeatureCvTermDbXRefByFeatureCvTerm" />
         <!-- <result property="pub" column="pub_id" select="selectPub" /> -->
      </resultMap>
  
@@ -56,4 +58,17 @@
         ORDER BY fc.feature_cvterm_id, fc.rank, type_id, fcp.rank;
      </select>
      
+    <delete id="deleteFeatureCvTerm" parameterClass="FeatureCvTerm">
+      DELETE FROM feature_cvterm WHERE
+      feature_cvterm_id=$featureCvTermId$
+    </delete>
+    
+    <!--  UPDATE  -->
+    <update id="updateFeatureCvTerm" 
+            parameterClass="FeatureCvTerm">
+      UPDATE feature_cvterm
+      SET rank=$rank$
+      WHERE feature_cvterm_id=$featureCvTermId$
+    </update>
+     
 </sqlMap>
\ No newline at end of file
diff --git a/artemis_sqlmap/FeatureCvTermDbXRef.xml b/artemis_sqlmap/FeatureCvTermDbXRef.xml
index 459aa9a4b23bd5917a8de432a01e2559ed85faac..409f8451ee34292ce26bb6d3e95a69a5b2301700 100644
--- a/artemis_sqlmap/FeatureCvTermDbXRef.xml
+++ b/artemis_sqlmap/FeatureCvTermDbXRef.xml
@@ -7,6 +7,9 @@
 
      <typeAlias alias="FeatureCvTermDbXRef"
         type="org.gmod.schema.sequence.FeatureCvTermDbXRef"/>
+     
+     <typeAlias alias="FeatureCvTerm"
+        type="org.gmod.schema.sequence.FeatureCvTerm"/>
         
      <resultMap id="select-featurecvtermdbxref" class="FeatureCvTermDbXRef"
                 groupBy="featureCvTermId">
@@ -32,4 +35,12 @@
        </dynamic>
     </select>
      
+    <select id="getFeatureCvTermDbXRefByFeatureCvTerm" parameterClass="java.lang.Integer"
+             resultMap="select-featurecvtermdbxref">
+       SELECT fcd.feature_cvterm_id, dbx.*, db.name 
+       FROM feature_cvterm_dbxref fcd 
+       LEFT JOIN dbxref dbx ON dbx.dbxref_id=fcd.dbxref_id 
+       LEFT JOIN db ON db.db_id=dbx.db_id
+       WHERE feature_cvterm_id=$feature_cvterm_id$
+    </select>
 </sqlMap>
\ No newline at end of file
diff --git a/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java b/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java
index 0dfa0f5b5b4e42f60adf4eae2eac964ab854b843..4f20b63d11db0046754e0e1be1f4bd26422b588e 100644
--- a/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java
+++ b/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java
@@ -54,6 +54,7 @@ import java.util.List;
 import java.util.Enumeration;
 import javax.swing.JOptionPane;
 
+import org.gmod.schema.sequence.FeatureCvTermProp;
 import org.gmod.schema.sequence.FeatureLoc;
 import org.gmod.schema.sequence.FeatureProp;
 import org.gmod.schema.sequence.FeatureDbXRef;
@@ -1113,7 +1114,8 @@ public class ChadoTransactionManager
            
            tsn = new ChadoTransaction(ChadoTransaction.DELETE,
                old_dbxref,
-               feature.getLastModified(), feature);  
+               feature.getLastModified(), feature);
+           sql.add(tsn);
          }
          else if(qualifier_name.equals("codon_start"))
          {
@@ -1127,13 +1129,56 @@ public class ChadoTransactionManager
          }
          else if(isCvTag(qualifier_name))
          {
+           /*Qualifier qual = feature.getQualifierByName(qualifier_name);
+           StringVector values = qual.getValues();
+           int beginIndex = qualifier_string.indexOf("term=")+5;
+           int endIndex   = qualifier_string.indexOf(";",beginIndex);
+           final String thisTerm;
+           if(endIndex > -1)
+             thisTerm = qualifier_string.substring(beginIndex, endIndex);
+           else
+             thisTerm = qualifier_string.substring(beginIndex);*/
+           
            Splash.logger4j.debug(uniquename+"  in handleReservedTags() DELETE "+
                qualifier_name+" "+qualifier_string);
+           
            FeatureCvTerm feature_cvterm = getFeatureCvTerm(qualifier_name, qualifier_string, 
                                                            uniquename);
+           /*Vector rankables = null;
+           int rank = 0;
+           for(int j=0; j<values.size(); j++)
+           {
+             String val = (String)values.get(j);
+             if(val.indexOf(thisTerm) > -1 &&
+                !val.equals(qualifier_string))
+             {
+               if(rankables == null)
+                 rankables = new Vector();
+               
+               FeatureCvTerm fc = getFeatureCvTerm(qualifier_name, val, 
+                                                   uniquename);
+               fc.setRank(rank);
+               rankables.add(fc);
+               rank++;
+               System.out.println("UPDATE ------> "+values.get(j));
+             }
+           }*/
+           
            tsn = new ChadoTransaction(ChadoTransaction.DELETE,
                                       feature_cvterm,
-                                      feature.getLastModified(), feature);       
+                                      feature.getLastModified(), feature);
+           sql.add(tsn);
+           
+           /*if(rankables != null)
+           {
+             for(int j=0; j<rankables.size(); j++)
+             {
+               feature_cvterm = (FeatureCvTerm)rankables.get(j);
+               tsn = new ChadoTransaction(ChadoTransaction.UPDATE,
+                 feature_cvterm,
+                 feature.getLastModified(), feature);
+             }
+           }*/
          }
          else if(isSynonymTag(qualifier_name))
          {
@@ -1145,9 +1190,10 @@ public class ChadoTransactionManager
           
            tsn = new ChadoTransaction(ChadoTransaction.DELETE,
                feature_synonym,
-               feature.getLastModified(), feature);   
+               feature.getLastModified(), feature);
+           sql.add(tsn);
          }
-         sql.add(tsn);
+         
       }
     }
     
@@ -1404,6 +1450,7 @@ public class ChadoTransactionManager
       return feature_cvterm;
     }
     
+    List featureCvTermProps = new Vector();
     StringVector strings = StringVector.getStrings(qualifier_string, ";");
     for(int i=0; i<strings.size(); i++)
     {    
@@ -1452,8 +1499,19 @@ public class ChadoTransactionManager
       
       // feature_cvterm_prop's  
       
+      if(this_qualifier_part.toLowerCase().startsWith("evidence="))
+      {
+        String evidence = this_qualifier_part.substring(9);
+        FeatureCvTermProp featureCvTermProp = new FeatureCvTermProp();
+        featureCvTermProp.setValue(evidence);
+        featureCvTermProps.add(featureCvTermProp);
+        
+        continue;
+      }
     }
     
+    feature_cvterm.setFeatureCvTermProps(featureCvTermProps);
+    
     Splash.logger4j.debug("Finished building FeatureCvTerm for "+uniqueName);
     return feature_cvterm;
   }
diff --git a/uk/ac/sanger/artemis/chado/IBatisDAO.java b/uk/ac/sanger/artemis/chado/IBatisDAO.java
index 742ac5edf1a2dc20de29a8d3063da4d5ad06d40f..5f4097df5370e18cc8d485d4db413715daa7af2b 100644
--- a/uk/ac/sanger/artemis/chado/IBatisDAO.java
+++ b/uk/ac/sanger/artemis/chado/IBatisDAO.java
@@ -31,6 +31,7 @@ import java.sql.*;
 
 import org.gmod.schema.sequence.Feature;
 import org.gmod.schema.sequence.FeatureCvTerm;
+import org.gmod.schema.sequence.FeatureCvTermDbXRef;
 import org.gmod.schema.sequence.FeatureDbXRef;
 import org.gmod.schema.sequence.FeatureProp;
 import org.gmod.schema.sequence.Synonym;
@@ -450,6 +451,9 @@ public class IBatisDAO extends GmodDAO
       sqlMap.update("updateFeatureProp", o);
     else if(o instanceof FeatureRelationship)
       sqlMap.update("updateFeatureRelationshipsForSubjectId", o);
+    else if(o instanceof FeatureCvTerm)
+      sqlMap.update("updateFeatureCvTerm", o);
+      
   }
   
   
@@ -490,6 +494,8 @@ public class IBatisDAO extends GmodDAO
       sqlMap.delete("deleteFeatureDbXRef", o);
     else if(o instanceof FeatureSynonym)
       deleteFeatureSynonym((FeatureSynonym)o);
+    else if(o instanceof FeatureCvTerm)
+      deleteFeatureCvTerm((FeatureCvTerm)o);
   }
 
 
@@ -627,6 +633,97 @@ public class IBatisDAO extends GmodDAO
       return sqlMap.delete("deleteAlias", feature_synonym);
   }
   
+  /**
+   * Delete featureCvTerm and update associated feature_cvterm.rank's 
+   * if appropriate
+   * @param featureCvTerm
+   */
+  private void deleteFeatureCvTerm(FeatureCvTerm featureCvTerm)
+  {
+    List featureCvTerms = getFeatureCvTermsByFeature(featureCvTerm.getFeature());
+       
+    List featureCvTermDbXRefs = new Vector();;
+    
+    if(featureCvTerm.getFeatureCvTermDbXRefs() != null &&
+       featureCvTerm.getFeatureCvTermDbXRefs().size() > 0)
+      featureCvTermDbXRefs = (List)featureCvTerm.getFeatureCvTermDbXRefs();
+    
+    // delete feature_cvterm and update ranks if asppropriate
+    FeatureCvTerm deleteme = null;
+    Vector rankable = null;
+    
+    for(int i=0; i<featureCvTerms.size(); i++)
+    {
+      FeatureCvTerm this_feature_cvterm = (FeatureCvTerm)featureCvTerms.get(i);
+      if(this_feature_cvterm.getCvTerm().getName().equals( 
+         featureCvTerm.getCvTerm().getName() ))
+      {     
+         List this_featureCvTermDbXRefs = (List)this_feature_cvterm.getFeatureCvTermDbXRefs();
+         
+         if(this_featureCvTermDbXRefs == null)
+           this_featureCvTermDbXRefs = new Vector();
+         
+         if(this_featureCvTermDbXRefs.size() != featureCvTermDbXRefs.size())
+         {
+           if(rankable == null)
+             rankable = new Vector();
+           
+           rankable.add(this_feature_cvterm);
+           continue;
+         }
+         
+         boolean found = true;
+         for(int j=0; j<this_featureCvTermDbXRefs.size(); j++)
+         {
+           FeatureCvTermDbXRef fcd = (FeatureCvTermDbXRef)this_featureCvTermDbXRefs.get(j);
+           if(!containsFeatureCvTermDbXRef(fcd, featureCvTermDbXRefs))
+           {
+             found = false;
+             break;
+           }
+         }
+         if(!found)
+         {
+           if(rankable == null)
+             rankable = new Vector();
+           
+           rankable.add(this_feature_cvterm);
+           continue;
+         }
+         deleteme = this_feature_cvterm;
+      }
+    }
+    sqlMap.delete("deleteFeatureCvTerm", deleteme);
+    
+    if(rankable != null)
+    {
+      
+      // feature_cvterm.rank needs updating for those stored here
+      System.out.println( "********> "+ deleteme.getCvTerm().getCv().getName() + "   rank = " +
+                          deleteme.getRank());
+      for(int i=0; i<rankable.size(); i++)
+      {
+        FeatureCvTerm fc = (FeatureCvTerm)rankable.get(i);
+        System.out.println( "********> "+ fc.getCvTerm().getCv().getName() + "   rank = " +
+                            fc.getRank());
+        fc.setRank(i);
+        sqlMap.delete("updateFeatureCvTerm", fc);
+      }
+    }
+  }
+  
+  private boolean containsFeatureCvTermDbXRef(FeatureCvTermDbXRef fcd, List featureCvTermDbXRefs)
+  {
+    for(int i=0; i<featureCvTermDbXRefs.size(); i++)
+    {
+      FeatureCvTermDbXRef this_fcd = (FeatureCvTermDbXRef)featureCvTermDbXRefs.get(i);
+      if( this_fcd.getDbXRef().getAccession().equals( fcd.getDbXRef().getAccession() ) &&
+          this_fcd.getDbXRef().getDb().getName().equals( fcd.getDbXRef().getDb().getName() ))
+        return true;
+    }
+    return false;
+  }
+  
   public void startTransaction() throws SQLException
   { 
     sqlMap.startTransaction();