diff --git a/etc/versions b/etc/versions
index e9e6db733650269b69961ec002acba9a3dc000bb..4586459d47ef2fc5bc03cc81b1c890bff9b6cf8a 100644
--- a/etc/versions
+++ b/etc/versions
@@ -1,4 +1,4 @@
-Artemis Release 16.0.2
-ACT Release 13.0.2
+Artemis Release 16.0.3
+ACT Release 13.0.3
 DNAPlotter Release 1.11
 BamView 1.2.11
\ No newline at end of file
diff --git a/uk/ac/sanger/artemis/components/SelectMenu.java b/uk/ac/sanger/artemis/components/SelectMenu.java
index 4d801fa1f5029a0f9751b3ea55b28de0d39c4900..c2ac0e93ea9d70fc4ccb0cb2323736e21c8a163a 100644
--- a/uk/ac/sanger/artemis/components/SelectMenu.java
+++ b/uk/ac/sanger/artemis/components/SelectMenu.java
@@ -1000,37 +1000,65 @@ public class SelectMenu extends SelectionMenu
       }
     }
   }
-  
 
   /**
-   *  If there are some selected bases select the features that are
+   *  If there are some selected bases or features select the features that are
    *  fully contained within that selection.
    **/
   private void selectContainedFeatures () {
     final MarkerRange selected_marker_range =
       getSelection ().getMarkerRange ();
 
-    if (selected_marker_range == null) {
-      new MessageDialog (getParentFrame (), "sequence range is not selected");
-      return;
-    } else {
-      try {
-        final FeatureVector featuresInRange =
-            getEntryGroup ().getFeaturesInRange (selected_marker_range.getRawRange ());
-        final FeatureVector featuresContainedByRange = new FeatureVector();
-        for(int i=0; i<featuresInRange.size(); i++)
-        {
-          Feature f = featuresInRange.elementAt(i);
-          Range maxR =  f.getMaxRawRange(); 
-          if(selected_marker_range.getRawStart().getRawPosition() <= maxR.getStart() &&
-             selected_marker_range.getRawEnd().getRawPosition()   >= maxR.getEnd())
-            featuresContainedByRange.add(f);
+    final FeatureVector featuresContainedByRange;
+    try
+    {
+      if (selected_marker_range == null) {
+        final FeatureVector selected_features = getSelection ().getAllFeatures ();
+        if (selected_features.size () == 0) {
+          new MessageDialog (getParentFrame (), "nothing selected");
+          return;
         }
-        getSelection ().set (featuresContainedByRange);
-      } catch (OutOfRangeException e) {
-        throw new Error ("internal error - unexpected exception: " + e);
+
+        featuresContainedByRange = new FeatureVector();
+        for(int i=0; i<selected_features.size(); i++) {
+          Range r = selected_features.elementAt(i).getMaxRawRange();
+          final FeatureVector featuresContained = getFeaturesContainedByRange(r);
+          for(int j=0; j<featuresContained.size(); j++) {
+            final Feature f = featuresContained.elementAt(j);
+            if(!featuresContainedByRange.contains(f) && !selected_features.contains(f))
+              featuresContainedByRange.add(f);
+          }
+        }
+      } else {
+        featuresContainedByRange = getFeaturesContainedByRange(
+            selected_marker_range.getRawRange());
       }
+    } catch (OutOfRangeException e) {
+      throw new Error ("internal error - unexpected exception: " + e);
+    }
+    getSelection ().set (featuresContainedByRange);
+  }
+
+  /**
+   * Return the features that are contained by a given range
+   * @param r
+   * @return
+   * @throws OutOfRangeException
+   */
+  private FeatureVector getFeaturesContainedByRange(Range r) throws OutOfRangeException
+  {
+    final FeatureVector featuresInRange =
+        getEntryGroup ().getFeaturesInRange (r);
+    final FeatureVector featuresContainedByRange = new FeatureVector();
+    for(int i=0; i<featuresInRange.size(); i++)
+    {
+      Feature f = featuresInRange.elementAt(i);
+      Range maxR =  f.getMaxRawRange(); 
+      if(r.getStart() <= maxR.getStart() &&
+         r.getEnd()   >= maxR.getEnd())
+        featuresContainedByRange.add(f);
     }
+    return featuresContainedByRange;
   }
 
   /**