diff --git a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java
index 2daccd386066abe3e3c31b5802303494787feb11..bee966d31a6871bce8f6089e57f9d5445af15eb0 100644
--- a/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java
+++ b/uk/ac/sanger/artemis/components/genebuilder/GeneUtils.java
@@ -593,9 +593,8 @@ public class GeneUtils
     final Vector<ChadoCanonicalGene> newGenes = new Vector<ChadoCanonicalGene>();
     for (int i = 0 ; i < features_to_duplicate.size () ; ++i) 
     {
-      final uk.ac.sanger.artemis.Feature this_feature = 
-                           features_to_duplicate.elementAt(i);
-      final GFFStreamFeature gffFeature = (GFFStreamFeature)this_feature.getEmblFeature();
+      final GFFStreamFeature gffFeature = 
+           (GFFStreamFeature)features_to_duplicate.elementAt(i).getEmblFeature();
       if(duplicatedGenes.contains(gffFeature.getChadoGene()))
         continue;
       
@@ -614,61 +613,39 @@ public class GeneUtils
         newchadoGene.setGene(newGeneFeature.getEmblFeature());
         
         final List<Feature> transcripts = chadoGene.getTranscripts();
-        for(int j=0; j<transcripts.size(); j++)
+        for(int j=0; j<transcripts.size(); j++) // duplicate transcripts and children
         {
           final GFFStreamFeature transcript = (GFFStreamFeature)transcripts.get(j);
-          final String transcriptName =
-            (String)transcript.getQualifierByName("ID").getValues().get(0);
+          final String transcriptName = getUniqueName(transcript);
           
-          uk.ac.sanger.artemis.Feature newTranscriptFeature = 
-            duplicateFeature(transcript, newchadoGene);
+          uk.ac.sanger.artemis.Feature newTranscriptFeature = duplicateFeature(transcript, newchadoGene);
           newchadoGene.addTranscript(newTranscriptFeature.getEmblFeature());
-          final String newTranscriptName =
-            (String)newTranscriptFeature.getQualifierByName("ID").getValues().get(0);
-          
-          List newFeatures;
-          
-          newFeatures= duplicateFeatures(chadoGene.get3UtrOfTranscript(transcriptName), newchadoGene);
-          for(int k=0; k<newFeatures.size(); k++)
-          {
-            uk.ac.sanger.artemis.Feature utrFeature = 
-              (uk.ac.sanger.artemis.Feature)newFeatures.get(k);
+          final String newTranscriptName = getUniqueName(newTranscriptFeature.getEmblFeature());
+
+          List<uk.ac.sanger.artemis.Feature> newFeatures= 
+              duplicateFeatures(chadoGene.get3UtrOfTranscript(transcriptName), newchadoGene);
+          for(uk.ac.sanger.artemis.Feature utrFeature: newFeatures)
             newchadoGene.add3PrimeUtr(newTranscriptName, utrFeature.getEmblFeature());
-          }
           
           newFeatures = duplicateFeatures(chadoGene.get5UtrOfTranscript(transcriptName), newchadoGene);
-          for(int k=0; k<newFeatures.size(); k++)
-          {
-            uk.ac.sanger.artemis.Feature utrFeature = 
-              (uk.ac.sanger.artemis.Feature)newFeatures.get(k);
+          for(uk.ac.sanger.artemis.Feature utrFeature: newFeatures)
             newchadoGene.add5PrimeUtr(newTranscriptName, utrFeature.getEmblFeature());
-          }
           
           newFeatures = duplicateFeatures(chadoGene.getOtherFeaturesOfTranscript(transcriptName), newchadoGene);
-          for(int k=0; k<newFeatures.size(); k++)
-          {
-            uk.ac.sanger.artemis.Feature otherFeature = 
-              (uk.ac.sanger.artemis.Feature)newFeatures.get(k);
+          for(uk.ac.sanger.artemis.Feature otherFeature: newFeatures)
             newchadoGene.addOtherFeatures(newTranscriptName, otherFeature.getEmblFeature());
-          }
 
           newFeatures = duplicateFeatures(chadoGene.getSplicedFeaturesOfTranscript(transcriptName), newchadoGene);
-          for(int k=0; k<newFeatures.size(); k++)
-          {
-            uk.ac.sanger.artemis.Feature splicedFeature = 
-              (uk.ac.sanger.artemis.Feature)newFeatures.get(k);
+          for(uk.ac.sanger.artemis.Feature splicedFeature: newFeatures)
             newchadoGene.addSplicedFeatures(newTranscriptName, splicedFeature.getEmblFeature());
-          }
           
           uk.ac.sanger.artemis.Feature newProtein = 
             duplicateFeature(chadoGene.getProteinOfTranscript(transcriptName), newchadoGene);
           if(newProtein != null)
             newchadoGene.addProtein(newTranscriptName, newProtein.getEmblFeature());
-          
         }
       } 
       catch (ReadOnlyException e) {}
-      catch(InvalidRelationException e) {}
     }
     
     duplicatedGenes.clear();
@@ -704,34 +681,6 @@ public class GeneUtils
     ((GFFStreamFeature)newFeature.getEmblFeature()).setChadoGene(chadoGene);
     if(isHiddenFeature(newFeature.getKey().getKeyString()))
       ((GFFStreamFeature)newFeature.getEmblFeature()).setVisible(false);
-    /*
-    try
-    {
-      final QualifierVector qv = newFeature.getQualifiers().copy();
-      
-      for(int i=0; i<qv.size(); i++)
-      {
-        final Qualifier qualifier = (Qualifier)qv.elementAt(i);
-        if(!qualifier.getName().equals("ID") &&
-           !qualifier.getName().equals("Parent") &&
-           !qualifier.getName().equals("Derives_from") &&
-           ChadoTransactionManager.isSpecialTag(qualifier.getName()))
-          newFeature.getQualifiers().removeQualifierByName(qualifier.getName());
-      }
-
-      newFeature.set(newFeature.getKey(), newFeature.getLocation(), qv);
-    }
-    catch(EntryInformationException e)
-    {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
-    }
-    catch(OutOfRangeException e)
-    {
-      // TODO Auto-generated catch block
-      e.printStackTrace();
-    }
-    */
     return newFeature;
   }
   
@@ -1001,6 +950,12 @@ public class GeneUtils
       feature.removeFromEntry();
   }
 
+  public static void deleteAllFeature(uk.ac.sanger.artemis.Feature feature,
+      final ChadoCanonicalGene chado_gene) throws ReadOnlyException
+  {
+    deleteAllFeature(feature, chado_gene, true); 
+  }
+  
   /**
    * Delete feature and children in a chado gene model
    * @param feature
@@ -1008,20 +963,22 @@ public class GeneUtils
    * @throws ReadOnlyException
    */
   public static void deleteAllFeature(uk.ac.sanger.artemis.Feature feature,
-      final ChadoCanonicalGene chado_gene) throws ReadOnlyException
+      final ChadoCanonicalGene chado_gene, final boolean updateChadoCanonicalGene) throws ReadOnlyException
   {
-    Set children = chado_gene.getChildren(feature.getEmblFeature());
+    Set<Feature> children = chado_gene.getChildren(feature.getEmblFeature());
     deleteFeature(feature);
-    chado_gene.deleteFeature(feature.getEmblFeature());
+    if(updateChadoCanonicalGene)
+      chado_gene.deleteFeature(feature.getEmblFeature());
 
     Feature embl_feature;
-    Iterator it = children.iterator();
+    Iterator<Feature> it = children.iterator();
 
     while(it.hasNext())
     {
-      embl_feature = (Feature) it.next();
+      embl_feature = it.next();
       deleteFeature((uk.ac.sanger.artemis.Feature) embl_feature.getUserData());
-      chado_gene.deleteFeature(embl_feature);
+      if(updateChadoCanonicalGene)
+        chado_gene.deleteFeature(embl_feature);
     }
   }