diff --git a/uk/ac/sanger/artemis/Feature.java b/uk/ac/sanger/artemis/Feature.java
index 1d834b09ee51a45da6b64c0626a0b89cae1145e3..8d99f031cfeffea8bf4ffaee264784ac4f9f0140 100644
--- a/uk/ac/sanger/artemis/Feature.java
+++ b/uk/ac/sanger/artemis/Feature.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/Feature.java,v 1.14 2005-10-11 14:20:31 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/Feature.java,v 1.15 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis;
@@ -60,7 +60,7 @@ import java.util.Date;
  *  embl.Feature and embl.Entry objects.
  *
  *  @author Kim Rutherford
- *  @version $Id: Feature.java,v 1.14 2005-10-11 14:20:31 tjc Exp $
+ *  @version $Id: Feature.java,v 1.15 2005-11-15 12:21:18 tjc Exp $
  **/
 
 public class Feature
@@ -215,6 +215,34 @@ public class Feature
 
       if(event.getType() == SequenceChangeEvent.REVERSE_COMPLEMENT) 
         reverseComplement(getEntry().getBases().getLength());
+      else if(event.getType() == SequenceChangeEvent.CONTIG_REVERSE_COMPLEMENT)
+      {
+         final Location old_location = getLocation();
+
+        // if the event is contained within this feature then the feature
+        // sequence may have changed
+        final Range this_feature_range = getMaxRawRange();
+
+        boolean feature_changed = false;
+        Range eventRange = event.getRange();
+        
+        // reverse complement feature if within contig region
+        if(eventRange.getStart() <= this_feature_range.getStart() &&
+           eventRange.getEnd() >= this_feature_range.getEnd())
+        {
+          try
+          {
+            final Location new_location =
+               getLocation().reverseComplement(event.getLength(), eventRange.getStart());
+     
+            setLocationInternal(new_location);
+          }
+          catch(OutOfRangeException e)
+          {
+            throw new Error("internal error - inconsistent location: " + e);
+          }
+        } 
+      }
       else 
       {
         final Location old_location = getLocation();
diff --git a/uk/ac/sanger/artemis/FeatureSegment.java b/uk/ac/sanger/artemis/FeatureSegment.java
index a780fb28df3ce154b4bd98d6e84ba670f08ce4d9..3406b61be091e06ecfd8f1fec217e392a751ff11 100644
--- a/uk/ac/sanger/artemis/FeatureSegment.java
+++ b/uk/ac/sanger/artemis/FeatureSegment.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/FeatureSegment.java,v 1.2 2005-05-03 09:12:09 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/FeatureSegment.java,v 1.3 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis;
@@ -39,7 +39,7 @@ import java.util.Vector;
  *  must be a coding sequence.
  *
  *  @author Kim Rutherford
- *  @version $Id: FeatureSegment.java,v 1.2 2005-05-03 09:12:09 tjc Exp $
+ *  @version $Id: FeatureSegment.java,v 1.3 2005-11-15 12:21:18 tjc Exp $
  *
  **/
 
@@ -264,10 +264,12 @@ public class FeatureSegment
    *  Implementation of the SequenceChangeListener interface.  We listen for
    *  this event so that we can update the range of this segment.
    **/
-  public void sequenceChanged (final SequenceChangeEvent event) {
+  public void sequenceChanged (final SequenceChangeEvent event) 
+  {
     // the location of the feature itself will change later
-
-    if (event.getType () != SequenceChangeEvent.REVERSE_COMPLEMENT) {
+    if(event.getType () != SequenceChangeEvent.REVERSE_COMPLEMENT &&
+       event.getType () != SequenceChangeEvent.CONTIG_REVERSE_COMPLEMENT) 
+    {
       updateRange ();
     }
   }
diff --git a/uk/ac/sanger/artemis/components/EditMenu.java b/uk/ac/sanger/artemis/components/EditMenu.java
index e6f47257a3bcc58fbeb0682b143f02cd205a910c..ed5919c934124a9c2ef535b0b2b7c824c1f48bbd 100644
--- a/uk/ac/sanger/artemis/components/EditMenu.java
+++ b/uk/ac/sanger/artemis/components/EditMenu.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/EditMenu.java,v 1.5 2005-10-11 14:20:31 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/EditMenu.java,v 1.6 2005-11-15 12:21:18 tjc Exp $
  **/
 
 package uk.ac.sanger.artemis.components;
@@ -53,7 +53,7 @@ import javax.swing.*;
  *  A menu with editing commands.
  *
  *  @author Kim Rutherford
- *  @version $Id: EditMenu.java,v 1.5 2005-10-11 14:20:31 tjc Exp $
+ *  @version $Id: EditMenu.java,v 1.6 2005-11-15 12:21:18 tjc Exp $
  **/
 
 public class EditMenu extends SelectionMenu
@@ -485,6 +485,40 @@ public class EditMenu extends SelectionMenu
       }
     });
 
+    final JMenuItem reverse_complement_range_item = new JMenuItem("Reverse And Complement Selected Contig");
+    reverse_complement_range_item.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent event)
+      {
+        final FeatureVector selected_features = getSelection().getAllFeatures();
+
+        if(selected_features.size() == 1)
+        {
+
+          final Feature selection_feature = selected_features.elementAt(0);
+          try 
+          {
+            getEntryGroup().getBases().reverseComplement(selection_feature);
+          }
+          catch(ReadOnlyException roe)
+          {
+            final String message =
+              "one or more of the features is read-only or is in a " +
+              "read-only entry - cannot continue";
+            new MessageDialog(null, message);
+            return;
+          }
+        }
+        else
+        {
+          final String message =
+              "Select a single contig to reverse and complement";
+          new MessageDialog(null, message);
+          return;   
+        }
+      }
+    });
+
     final JMenuItem delete_bases_item = new JMenuItem("Delete Selected Bases");
     delete_bases_item.addActionListener(new ActionListener() 
     {
@@ -549,7 +583,8 @@ public class EditMenu extends SelectionMenu
     addSeparator();
     add(auto_gene_name_item);
     add(fix_gene_names_item);
-    add(reverse_complement_item);
+    add(reverse_complement_item); 
+    add(reverse_complement_range_item);
     add(delete_bases_item);
     add(add_bases_item);
 
diff --git a/uk/ac/sanger/artemis/components/FeatureDisplay.java b/uk/ac/sanger/artemis/components/FeatureDisplay.java
index deb1822f02c40596dd5b7dc32cc65dd4d34681d9..6de6173da99f0ac407733f4548aeef530a9cda01 100644
--- a/uk/ac/sanger/artemis/components/FeatureDisplay.java
+++ b/uk/ac/sanger/artemis/components/FeatureDisplay.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FeatureDisplay.java,v 1.30 2005-10-20 13:28:36 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FeatureDisplay.java,v 1.31 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -47,7 +47,7 @@ import javax.swing.UIManager;
  *  This component is used for displaying an Entry.
  *
  *  @author Kim Rutherford
- *  @version $Id: FeatureDisplay.java,v 1.30 2005-10-20 13:28:36 tjc Exp $
+ *  @version $Id: FeatureDisplay.java,v 1.31 2005-11-15 12:21:18 tjc Exp $
  **/
 
 public class FeatureDisplay extends EntryGroupPanel
@@ -958,14 +958,14 @@ public class FeatureDisplay extends EntryGroupPanel
 
       makeBaseVisibleInternal(new_centre_position, true, false);
     } 
-    else 
+    else if(event.getType() != SequenceChangeEvent.CONTIG_REVERSE_COMPLEMENT)
       makeBaseVisibleInternal(event.getPosition(), true, false);
 
     fixScrollbar();
     needVisibleFeatureVectorUpdate();
     repaint();
 
-    if(event.getType() == SequenceChangeEvent.REVERSE_COMPLEMENT) 
+    if(event.getType() == SequenceChangeEvent.REVERSE_COMPLEMENT ) 
       fireAdjustmentEvent(DisplayAdjustmentEvent.REV_COMP_EVENT);
     else 
       fireAdjustmentEvent(DisplayAdjustmentEvent.SCROLL_ADJUST_EVENT);
diff --git a/uk/ac/sanger/artemis/io/Location.java b/uk/ac/sanger/artemis/io/Location.java
index fc4e8f3c7fa39ba5c2e8d3b661a36a81acb126ac..f7b4df21e344ba49029b0d988b44dfd09eb7198f 100644
--- a/uk/ac/sanger/artemis/io/Location.java
+++ b/uk/ac/sanger/artemis/io/Location.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/Location.java,v 1.5 2005-07-27 08:24:17 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/Location.java,v 1.6 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
@@ -34,7 +34,7 @@ import uk.ac.sanger.artemis.io.LocationLexer.TokenEnumeration;
  *  functions for parsing and manipulating the location.
  *
  *  @author Kim Rutherford
- *  @version $Id: Location.java,v 1.5 2005-07-27 08:24:17 tjc Exp $
+ *  @version $Id: Location.java,v 1.6 2005-11-15 12:21:18 tjc Exp $
  *
  */
 public class Location 
@@ -384,6 +384,27 @@ public class Location
     return new_location;
   }
 
+   /**
+   *  Return a reversed and complemented copy of this Location.
+   *  @param sequence_length The length of the sequence that this Location is
+   *    associated with.
+   *  @return a new Location that will be a reversed and complemented copy of
+   *    this Location.  The user_data fields in the returned Location will be
+   *    the same as the original.
+   **/
+  public Location reverseComplement(final int sequence_length, 
+                                    final int offset)
+  {
+    final Location new_location = new Location(getParsedLocation().copy());
+
+    new_location.parse_tree =
+      new_location.getParsedLocation().reverseComplement(sequence_length, offset);
+
+    new_location.parse_tree = new_location.parse_tree.getCanonical();
+    return new_location;
+  }
+
+
   /**
    *  Return a Range that spans the whole Location.
    **/
@@ -528,6 +549,12 @@ public class Location
     return parse_tree;
   }
 
+  public void setParsedLocation(LocationParseNode parse_tree)
+  {
+    this.parse_tree = parse_tree;
+  }
+
+
   /**
    *  Create a new Location object from the given LocationParseNode tree.
    **/
diff --git a/uk/ac/sanger/artemis/io/LocationParseNode.java b/uk/ac/sanger/artemis/io/LocationParseNode.java
index f2acb7fa369057b93aef49d93e4f6066483b1818..15ed80472dcbc0e5c81a51bbf12192abc35d44fa 100644
--- a/uk/ac/sanger/artemis/io/LocationParseNode.java
+++ b/uk/ac/sanger/artemis/io/LocationParseNode.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/LocationParseNode.java,v 1.5 2005-05-03 09:14:43 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/LocationParseNode.java,v 1.6 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
@@ -33,7 +33,7 @@ import uk.ac.sanger.artemis.util.OutOfRangeException;
  *  Location.  It is a utility class for EMBL.Location.
  *
  *  @author Kim Rutherford
- *  @version $Id: LocationParseNode.java,v 1.5 2005-05-03 09:14:43 tjc Exp $
+ *  @version $Id: LocationParseNode.java,v 1.6 2005-11-15 12:21:18 tjc Exp $
  *
  **/
 
@@ -401,7 +401,21 @@ class LocationParseNode extends EMBLObject
    *    associated with.
    *  @return a reversed and complemented tree.
    **/
-  LocationParseNode reverseComplement(final int sequence_length) 
+  LocationParseNode reverseComplement(final int sequence_length)
+  {
+    return reverseComplement(sequence_length, 0);
+  }
+
+  /**
+   *  Return a reversed and complemented copy of this Location.
+   *  @param sequence_length The length of the sequence that this Location is
+   *    associated with.
+   *  @param offset this is set to zero if the whole sequence is being
+   *    operated on or to the start of the region being reverse complemented.
+   *  @return a reversed and complemented tree.
+   **/
+  LocationParseNode reverseComplement(final int sequence_length,
+                                      final int offset) 
   {
     try
     {
@@ -412,9 +426,15 @@ class LocationParseNode extends EMBLObject
         case RANGE:
         {
           final Range range = getRange();
-          final Range new_range =
-            new Range(sequence_length - range.getEnd() + 1,
-                      sequence_length - range.getStart() + 1);
+          final int start = sequence_length - (range.getEnd() - offset + 1) + offset;
+          final int end   = sequence_length - (range.getStart() - offset + 1) + offset;
+
+//        System.out.println("LocationParseNode.reverseComplement() HERE "+ 
+//                  start+ ".."+ end +"   sequence_length="+sequence_length+
+//                 "   range.getEnd()="+range.getEnd()+ "   range.getStart()="+range.getStart()+
+//                 "   offset="+offset);
+
+          final Range new_range = new Range(start, end);
           final LocationParseNode new_range_node =
             new LocationParseNode(new_range);
           return new LocationParseNode(COMPLEMENT, new_range_node);
@@ -426,9 +446,12 @@ class LocationParseNode extends EMBLObject
           if(child.getType() == RANGE) 
           {
             final Range range = child.getRange();
-            final Range new_range =
-              new Range(sequence_length - range.getEnd() + 1,
-                        sequence_length - range.getStart() + 1);
+            final int start = sequence_length - (range.getEnd() - offset + 1) + offset;
+            final int end   = sequence_length - (range.getStart() - offset + 1) + offset;
+
+            final Range new_range = new Range(start, end);
+//            new Range(sequence_length - (range.getEnd() - offset + 1) + offset,
+//                      sequence_length - (range.getStart() - offset + 1) + offset);
             return new LocationParseNode(new_range);
           }
           else
@@ -447,7 +470,7 @@ class LocationParseNode extends EMBLObject
             final LocationParseNode this_child = children.elementAt(i);
 
             final LocationParseNode new_child =
-              this_child.reverseComplement(sequence_length);
+              this_child.reverseComplement(sequence_length, offset);
             new_children.addElementAtEnd(new_child);
           }
 
diff --git a/uk/ac/sanger/artemis/io/SimpleDocumentEntry.java b/uk/ac/sanger/artemis/io/SimpleDocumentEntry.java
index be8a2474fa1df3d87b97bb4651fc8714e2c977a7..c03bd6383bfd1a9d732f4f3092ccb63e4f747db3 100644
--- a/uk/ac/sanger/artemis/io/SimpleDocumentEntry.java
+++ b/uk/ac/sanger/artemis/io/SimpleDocumentEntry.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/SimpleDocumentEntry.java,v 1.16 2005-10-26 16:10:38 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/SimpleDocumentEntry.java,v 1.17 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
@@ -37,7 +37,7 @@ import java.util.Enumeration;
  *  This class contains the methods common to all DocumentEntry objects.
  *
  *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: SimpleDocumentEntry.java,v 1.16 2005-10-26 16:10:38 tjc Exp $
+ *  @version $Id: SimpleDocumentEntry.java,v 1.17 2005-11-15 12:21:18 tjc Exp $
  **/
 
 abstract public class SimpleDocumentEntry
@@ -217,8 +217,9 @@ abstract public class SimpleDocumentEntry
             else 
               qualifiers.setQualifier(new Qualifier("colour", "11"));
 
-            final ReadOnlyEmblStreamFeature new_feature =
-              new ReadOnlyEmblStreamFeature(new Key("fasta_record"),
+            //ReadOnlyEmblStreamFeature
+            final EmblStreamFeature new_feature =
+              new EmblStreamFeature(new Key("fasta_record"),
                                              new Location(new_range),
                                              qualifiers);
 
diff --git a/uk/ac/sanger/artemis/io/StreamSequence.java b/uk/ac/sanger/artemis/io/StreamSequence.java
index 38e2dcef44191766c5f01dca0b68612d5bee4804..168ee0e7401c68c696de70f8215ac90fd68d25f2 100644
--- a/uk/ac/sanger/artemis/io/StreamSequence.java
+++ b/uk/ac/sanger/artemis/io/StreamSequence.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/StreamSequence.java,v 1.9 2005-09-02 16:25:50 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/io/StreamSequence.java,v 1.10 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.io;
@@ -35,7 +35,7 @@ import java.io.Writer;
  *  Sequence stored in 4 bit chunks.
  *
  *  @author Kim Rutherford
- *  @version $Id: StreamSequence.java,v 1.9 2005-09-02 16:25:50 tjc Exp $
+ *  @version $Id: StreamSequence.java,v 1.10 2005-11-15 12:21:18 tjc Exp $
  **/
 
 public abstract class StreamSequence
@@ -97,7 +97,7 @@ public abstract class StreamSequence
     }
   }
 
-  protected void forceReset()
+  public void forceReset()
   {
     dst = null;
   }
diff --git a/uk/ac/sanger/artemis/sequence/Bases.java b/uk/ac/sanger/artemis/sequence/Bases.java
index 271b8be58bc659a0fc0efb62ee3aed4fd88c88b7..57c2b6c1ab6fc044eb333ee2a2be24a42ebca640 100644
--- a/uk/ac/sanger/artemis/sequence/Bases.java
+++ b/uk/ac/sanger/artemis/sequence/Bases.java
@@ -20,15 +20,17 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/sequence/Bases.java,v 1.16 2005-10-19 08:27:00 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/sequence/Bases.java,v 1.17 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.sequence;
 
+import uk.ac.sanger.artemis.Feature;
 import uk.ac.sanger.artemis.util.*;
 import uk.ac.sanger.artemis.io.Range;
 import uk.ac.sanger.artemis.io.EmblStreamSequence;
 import uk.ac.sanger.artemis.io.Sequence;
+import uk.ac.sanger.artemis.io.StreamSequence;
 
 import org.biojava.bio.symbol.IllegalSymbolException;
 
@@ -45,7 +47,7 @@ import java.util.Iterator;
  *  non-base letter returns '@'.
  *
  *  @author Kim Rutherford
- *  @version $Id: Bases.java,v 1.16 2005-10-19 08:27:00 tjc Exp $ */
+ *  @version $Id: Bases.java,v 1.17 2005-11-15 12:21:18 tjc Exp $ */
 
 public class Bases 
 {
@@ -1017,6 +1019,66 @@ public class Bases
     return new Bases (new_sequence);
   }
 
+
+  /**
+  *
+  * Reverse complement a range of the sequence.
+  *
+  */
+  public void reverseComplement(Feature feature)
+              throws ReadOnlyException 
+  {
+    forward_stop_codon_cache = null;
+    reverse_stop_codon_cache = null;
+   
+    final Range range = feature.getMaxRawRange();
+    final int range_start_index = range.getStart();
+    final int range_end_index   = range.getEnd();
+
+    // ensure we just get subsequence of interest
+    ((StreamSequence)getSequence()).forceReset();
+    // sequence to reverse complement
+    final char[] sub_sequence = reverseComplement(getSequence().getCharSubSequence(
+                                              range_start_index, range_end_index));  
+    final char[] new_sequence = new char[getLength()];
+    final char[] old_sequence = ((StreamSequence)getSequence()).getCharSequence();
+
+//  System.out.println("range_start_index  "+range_start_index);
+//  System.out.println("range_end_index    "+range_end_index);
+//  System.out.println("getLength          "+getLength());
+//  System.out.println("sub_sequence.length "+sub_sequence.length);
+//  System.out.println(feature.getEntry().getEMBLEntry().toString());
+//  System.out.println(new String(sub_sequence));
+
+    // if not first contig
+    if(range_start_index != 1)
+      System.arraycopy(old_sequence, 0, new_sequence, 0, range_start_index-2);
+
+    // copy in new sequence fragment that has been reverse complemented
+    System.arraycopy(sub_sequence, 0, new_sequence, range_start_index-1, 
+                                                    sub_sequence.length);
+
+    // if not last contig
+    if(range_end_index != getLength())
+      System.arraycopy(old_sequence, range.getEnd(), new_sequence, range_end_index,
+                                                    getLength()-range_end_index-1);
+                                                     
+    try 
+    {
+      embl_sequence.setFromChar(new_sequence);
+    } 
+    catch (IllegalSymbolException e) 
+    {
+      throw new Error ("internal error - unexpected exception: " + e);
+    }
+
+    final SequenceChangeEvent event =
+      new SequenceChangeEvent(this, SequenceChangeEvent.CONTIG_REVERSE_COMPLEMENT,
+                              range, sub_sequence.length);
+
+    fireSequenceChangeEvent (event);
+  }
+
   /**
    *  Delete the bases in the given range and send out a SequenceChange event
    *  to all the listeners.
diff --git a/uk/ac/sanger/artemis/sequence/Marker.java b/uk/ac/sanger/artemis/sequence/Marker.java
index ad134fec647f016cbfcafe5c32a82325db49d79b..1ecad0ed5044955e2a48880d7763868d5e29218d 100644
--- a/uk/ac/sanger/artemis/sequence/Marker.java
+++ b/uk/ac/sanger/artemis/sequence/Marker.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/sequence/Marker.java,v 1.1 2004-06-09 09:52:16 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/sequence/Marker.java,v 1.2 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.sequence;
@@ -32,7 +32,7 @@ import java.util.Vector;
  *  Objects of this class mark postions on one strand of DNA.
  *
  *  @author Kim Rutherford
- *  @version $Id: Marker.java,v 1.1 2004-06-09 09:52:16 tjc Exp $
+ *  @version $Id: Marker.java,v 1.2 2005-11-15 12:21:18 tjc Exp $
  *
  **/
 
@@ -224,7 +224,7 @@ public class Marker {
  *  alive by having a reference on the sequence change listener list.
  *
  *  @author Kim Rutherford
- *  @version $Id: Marker.java,v 1.1 2004-06-09 09:52:16 tjc Exp $
+ *  @version $Id: Marker.java,v 1.2 2005-11-15 12:21:18 tjc Exp $
  *
  **/
 class MarkerInternal
@@ -285,9 +285,9 @@ class MarkerInternal
    *  so that the Marker can be updated when the sequence changes.
    **/
   public void sequenceChanged (final SequenceChangeEvent event) {
-    if (event.getType () == SequenceChangeEvent.REVERSE_COMPLEMENT) {
+    if(event.getType () == SequenceChangeEvent.REVERSE_COMPLEMENT ||
+       event.getType () == SequenceChangeEvent.CONTIG_REVERSE_COMPLEMENT) 
       return;
-    }
 
     final int sub_sequence_length = event.getSubSequence ().length ();
 
diff --git a/uk/ac/sanger/artemis/sequence/SequenceChangeEvent.java b/uk/ac/sanger/artemis/sequence/SequenceChangeEvent.java
index 6b1321320e257ecc3d4e7133f2e1777a35095563..837c0c684d00d70e93f42078de47f82a0bcf6294 100644
--- a/uk/ac/sanger/artemis/sequence/SequenceChangeEvent.java
+++ b/uk/ac/sanger/artemis/sequence/SequenceChangeEvent.java
@@ -20,16 +20,18 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/sequence/SequenceChangeEvent.java,v 1.1 2004-06-09 09:52:24 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/sequence/SequenceChangeEvent.java,v 1.2 2005-11-15 12:21:18 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.sequence;
 
+import uk.ac.sanger.artemis.io.Range;
+
 /**
  *  This event is sent when the sequence of bases in a strand changes.
  *
  *  @author Kim Rutherford
- *  @version $Id: SequenceChangeEvent.java,v 1.1 2004-06-09 09:52:24 tjc Exp $
+ *  @version $Id: SequenceChangeEvent.java,v 1.2 2005-11-15 12:21:18 tjc Exp $
  *
  **/
 
@@ -53,6 +55,17 @@ public class SequenceChangeEvent extends uk.ac.sanger.artemis.ChangeEvent {
     this.sub_sequence = sub_sequence;
   }
 
+  public SequenceChangeEvent (final Bases bases,
+                              final int type,
+                              final Range range,
+                              final int length) {
+    super (bases);
+    this.type = type;
+    this.range  = range;
+    this.length = length;
+  }
+
+
   /**
    *  Create a new SequenceChangeEvent object.
    *  @param bases The Bases object that generated the event.
@@ -72,6 +85,8 @@ public class SequenceChangeEvent extends uk.ac.sanger.artemis.ChangeEvent {
 
   final public static int REVERSE_COMPLEMENT = 3;
 
+  final public static int CONTIG_REVERSE_COMPLEMENT = 4;
+
   /**
    *  Return the Bases reference that was passed to the constructor.
    **/
@@ -101,6 +116,16 @@ public class SequenceChangeEvent extends uk.ac.sanger.artemis.ChangeEvent {
     return sub_sequence;
   }
 
+  public int getLength()
+  {
+    return length;
+  }
+
+  public Range getRange()
+  {
+    return range;
+  }
+
   /**
    *  The type that was passed to the constructor.
    **/
@@ -115,6 +140,10 @@ public class SequenceChangeEvent extends uk.ac.sanger.artemis.ChangeEvent {
    *  The sub sequence of bases that was passed to the constructor.
    **/
   /* final */ private String sub_sequence;
+
+  private int length;
+ 
+  private Range range;
 }