diff --git a/uk/ac/sanger/artemis/io/IndexedGFFDocumentEntry.java b/uk/ac/sanger/artemis/io/IndexedGFFDocumentEntry.java
index f88f0152b6bf0df3eb303cc9d290a31b1a7bdd30..5a9ec3f634894c2dbb8b4eb60165075dde5158f3 100644
--- a/uk/ac/sanger/artemis/io/IndexedGFFDocumentEntry.java
+++ b/uk/ac/sanger/artemis/io/IndexedGFFDocumentEntry.java
@@ -187,6 +187,7 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
     
     final FeatureVector featuresInRange = new FeatureVector();
     final List<IndexContig> contigs = getContigsInRange(range);
+
     for(IndexContig c: contigs)
     {
       try
@@ -198,8 +199,7 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
         ioe.printStackTrace();
       }
     }
-    
-    
+
     if(featuresInRange.size() > 0 && GFFStreamFeature.isGTF((Feature)featuresInRange.get(0)))
     {
       // GTF
@@ -239,7 +239,9 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
      
     if(tabixIterator == null)
       return;
-    int pos[] = iterate(c, range.getStart(), range.getEnd(), tabixIterator, features);
+    
+    FeatureVector featuresInRange = new FeatureVector();
+    int pos[] = iterate(c, range.getStart(), range.getEnd(), tabixIterator, featuresInRange);
 
     if(pos[0] < range.getStart() || pos[1] > range.getEnd())
     {
@@ -250,15 +252,15 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
       tabixIterator = reader.query(r);
       if(tabixIterator == null)
         return;
-      features.clear();
+      featuresInRange.clear();
 
-      iterate(c, pos[0], pos[1], tabixIterator, features);
+      iterate(c, pos[0], pos[1], tabixIterator, featuresInRange);
     }
+    features.addAll(featuresInRange);
   }
   
   private int[] iterate(final IndexContig c, 
-                        int min,
-                        int max,
+                        int min, int max,
                         final TabixReader.Iterator tabixIterator, 
                         final FeatureVector features) throws NumberFormatException, ReadFormatException, IOException
   {
@@ -291,7 +293,11 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
     return new int[]{min, max};
   }
   
-  
+  /**
+   * Return the sequences that lie within a given range
+   * @param range
+   * @return
+   */
   private List<IndexContig> getContigsInRange(Range range)
   {
     final List<IndexContig> list = new Vector<IndexContig>();
@@ -312,10 +318,12 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
     for (String key : contigHash.keySet())
     {
       IndexContig contig = contigHash.get(key);
+      
       if( (range.getStart() >= contig.getOffsetStart() && range.getStart() <= contig.getOffsetEnd()) ||
-          (range.getEnd()   >= contig.getOffsetStart() && range.getEnd()   <= contig.getOffsetEnd()))
+          (range.getEnd()   >= contig.getOffsetStart() && range.getEnd()   <= contig.getOffsetEnd()) ||
+          (contig.getOffsetStart() >= range.getStart() && contig.getOffsetStart() <= range.getEnd()) ||
+          (contig.getOffsetEnd() >= range.getStart()   && contig.getOffsetEnd() <= range.getEnd()) )
       {
-        //System.out.println(contig.chr+" getChr() RANGE "+range.toString());
         list.add(contig);
       }
     }
@@ -1302,68 +1310,62 @@ public class IndexedGFFDocumentEntry implements DocumentEntry
   }
   
   class IndexGFFFeatureEnumeration implements FeatureEnumeration
-  {
-    private Iterator<IndexContig> contigIterator = getListOfContigs().iterator();
-    private TabixReader.Iterator tabixIterator;
-    private IndexContig c;
-    private String gffLine;
+  { 
+    private FeatureVector features;
+    private int idx = 0;
+    private int contigIdx = 0;
+    private List<IndexContig> contigs;
     
     public boolean hasMoreFeatures()
     {
-      try
+      if(features == null)
       {
-        if(tabixIterator == null && !hasNextTabixIterator())
-          return false;
-        
-        gffLine = tabixIterator.next();
-        if(gffLine != null)
-          return true;
-        
-        if(!hasNextTabixIterator())
+        if(entryGroup == null)
           return false;
-        gffLine = tabixIterator.next();
-        if(gffLine != null)
-          return true;
+
+        if(contigs == null)
+        {
+          try
+          {
+            contigs =  getContigsInRange(
+                new Range(1, entryGroup.getSequenceLength()));
+          }
+          catch (OutOfRangeException e){}
+        }
+        getFeaturesInContig();
       }
-      catch (IOException e){}
 
+      if(idx < features.size())
+        return true;
+      else
+      {
+        idx = 0;
+        contigIdx++;
+        if(contigIdx < contigs.size())
+        {
+          getFeaturesInContig();
+          if(idx < features.size())
+            return true;
+        }
+      }
       return false;
     }
-
+    
     public Feature nextFeature() throws NoSuchElementException
     {
-      try
-      {
-        final StringVector parts = StringVector.getStrings(gffLine, "\t", true);
-        gffLine = getGffInArtemisCoordinates(gffLine, parts, c);
-        return new GFFStreamFeature(gffLine);
-      }
-      catch (IOException e)
-      {
-        e.printStackTrace();
-      }
-      return null;
+      idx++;
+      return features.elementAt(idx-1);
     }
     
-    private boolean hasNextTabixIterator()
+    private void getFeaturesInContig()
     {
-      if(!contigIterator.hasNext())
-      {
-        tabixIterator = null;
-        return false;
-      }
-      c = contigIterator.next();
-      
-      Range range = null;
       try
       {
-        range = new Range(1, Integer.MAX_VALUE);
-      } catch (OutOfRangeException e){}
-      int start = getCoordInContigCoords(range.getStart(), c);
-      int end = getCoordInContigCoords(range.getEnd(), c);
-
-      tabixIterator = reader.query( c.chr+":"+start+"-"+end );
-      return true;
+        features = getFeaturesInRange(
+            new Range(contigs.get(contigIdx).getOffsetStart(), 
+                      contigs.get(contigIdx).getOffsetEnd()));
+      }
+      catch (OutOfRangeException e){}
     }
   }
-}
\ No newline at end of file
+}