diff --git a/uk/ac/sanger/artemis/chado/ChadoTransaction.java b/uk/ac/sanger/artemis/chado/ChadoTransaction.java
index 70f5c1d96810f111ea38d352c2d88b01653c2d91..aea13353407a0808d8dfa90c58433f0a606f22d6 100644
--- a/uk/ac/sanger/artemis/chado/ChadoTransaction.java
+++ b/uk/ac/sanger/artemis/chado/ChadoTransaction.java
@@ -92,6 +92,22 @@ public class ChadoTransaction
       this.featureKey   = featureKey;
   }
 
+  /**
+   * Copy this transaction
+   * @return
+   */
+  public ChadoTransaction copy()
+  {
+    final ChadoTransaction tsn = new ChadoTransaction(getType(), getFeatureObject(), 
+        getLastModified(), getGff_feature(), 
+        getFeatureKey(), logComment);
+    
+    if(uniquename != null)
+      tsn.setUniquename(uniquename);
+    
+    tsn.setOldUniquename(old_uniquename);
+    return tsn;
+  }
 
   /**
    * The type of SQL transaction
@@ -170,11 +186,6 @@ public class ChadoTransaction
     return gff_feature;
   }
 
-  public void setGff_feature(GFFStreamFeature gff_feature)
-  {
-    this.gff_feature = gff_feature;
-  }
-
 
   public String getFeatureKey()
   {
diff --git a/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java b/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java
index 3e7738ed94deda59cb79acb1a83a72038aea03e4..c05bc8abbe2e66dc99e71545d904b54cfe05e895 100644
--- a/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java
+++ b/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java
@@ -2390,20 +2390,22 @@ public class ChadoTransactionManager
                             final ChadoTransactionManager ctm)
   {
 	  DatabaseDocument.initMDC(dbDoc);
-    commitReturnValue = dbDoc.commit(ctm.getSql(), force);
+    
+    final Vector sqlCopy = ctm.getSql();
+    commitReturnValue = dbDoc.commit(sqlCopy, force);
     
     boolean nocommit = true;
     if(System.getProperty("nocommit") == null ||
        System.getProperty("nocommit").equals("false"))
       nocommit = false;
 
-    if(commitReturnValue == ctm.getSql().size())
+    if(commitReturnValue == sqlCopy.size())
     {
       if(!nocommit)
       {
-        for(int i = 0; i < ctm.getSql().size() && i < commitReturnValue; i++)
+        for(int i = 0; i < sqlCopy.size() && i < commitReturnValue; i++)
         {
-          ChadoTransaction tsn = (ChadoTransaction) ctm.getSql().get(i);
+          ChadoTransaction tsn = (ChadoTransaction) sqlCopy.get(i);
           logger4j.debug("COMMIT DONE " + tsn.getLogComment());
         }
       }
@@ -2414,9 +2416,10 @@ public class ChadoTransactionManager
     }
     else if(commitReturnValue > 0)
     {
-      ChadoTransaction tsn = (ChadoTransaction) ctm.getSql().get(commitReturnValue);
+      ChadoTransaction tsn = (ChadoTransaction) sqlCopy.get(commitReturnValue);
       logger4j.warn("COMMIT FAILED AT " + tsn.getLogComment());
     }
+    sqlCopy.clear();
   }
   
   /**
@@ -2443,7 +2446,15 @@ public class ChadoTransactionManager
 
   public Vector getSql()
   {
-    return sql;
+    final Vector tmpSql = new Vector(sql.size());
+    
+    for(int i=0;i<sql.size();i++)
+    {
+      ChadoTransaction tsn = (ChadoTransaction) sql.get(i);
+      tmpSql.add(tsn.copy());
+    }
+    
+    return tmpSql;
   }