diff --git a/modules/Bio/EnsEMBL/DBSQL/BaseAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/BaseAdaptor.pm
index 7598f890594cb10c4f1132e3f7b219e8f5c0d0fc..6fb5173eabe1ffe7c6d953f2a16e3f21d10494bd 100755
--- a/modules/Bio/EnsEMBL/DBSQL/BaseAdaptor.pm
+++ b/modules/Bio/EnsEMBL/DBSQL/BaseAdaptor.pm
@@ -343,7 +343,25 @@ sub bind_param_generic_fetch{
 
 sub generic_fetch {
   my ($self, $constraint, $mapper, $slice) = @_;
-  my @tabs = $self->_tables;
+
+  my @tabs = $self->_tables();
+
+  my $extra_default_where;
+
+  # Hack for feature types that needs to be restricted to species_id (in
+  # coord_system).
+  if ( $self->isa('Bio::EnsEMBL::DBSQL::BaseFeatureAdaptor') ) {
+    push @tabs, [ 'seq_region', 'sr' ], [ 'coord_system', 'cs' ];
+
+    $extra_default_where = sprintf(
+                      '%s.seq_region_id = sr.seq_region_id '
+                        . 'AND sr.coord_system_id = cs.coord_system_id '
+                        . 'AND cs.species_id = ?',
+                      $tabs[0]->[1] );
+
+    $self->bind_param_generic_fetch( $self->species_id(), SQL_INTEGER );
+  }
+
   my $columns = join(', ', $self->_columns());
 
   my $db = $self->db();
@@ -386,16 +404,24 @@ sub generic_fetch {
       "SELECT $straight_join $columns\n"
     . "FROM $left_join_prefix ($tablenames) $left_join";
 
-  my $default_where = $self->_default_where_clause;
+  my $default_where = $self->_default_where_clause();
   my $final_clause = $self->_final_clause;
 
+  if ($extra_default_where) {
+    if ($default_where) {
+      $default_where .= "\n AND $extra_default_where";
+    } else {
+      $default_where = $extra_default_where;
+    }
+  }
+
   #append a where clause if it was defined
-  if($constraint) {
+  if ($constraint) {
     $sql .= "\n WHERE $constraint ";
-    if($default_where) {
+    if ($default_where) {
       $sql .= " AND\n       $default_where ";
     }
-  } elsif($default_where) {
+  } elsif ($default_where) {
     $sql .= "\n WHERE $default_where ";
   }