diff --git a/modules/Bio/EnsEMBL/Map/DBSQL/DitagFeatureAdaptor.pm b/modules/Bio/EnsEMBL/Map/DBSQL/DitagFeatureAdaptor.pm
index fe832c96ddf5a08632529de49250057d6dee97ef..4dc83812366f972e053046e7530fe6a4135ef4dd 100644
--- a/modules/Bio/EnsEMBL/Map/DBSQL/DitagFeatureAdaptor.pm
+++ b/modules/Bio/EnsEMBL/Map/DBSQL/DitagFeatureAdaptor.pm
@@ -170,6 +170,7 @@ sub fetch_all_by_type {
   Example    : $tags = $ditagfeature_adaptor->fetch_all_by_Slice($slice, "SME005");
   Description: Retrieves ditagFeatures from the database overlapping a specific region
                and (optional) of a specific ditag type or analysis.
+               Start & end locations are returned in slice coordinates, now.
   Returntype : listref of Bio::EnsEMBL::Map::DitagFeatures
   Caller     : general
 
@@ -232,7 +233,7 @@ sub fetch_all_by_Slice {
                               WHERE  ditag_feature_id IN(".$ids_to_fetch.")" );
     $sth->execute();
 
-    my $result = $self->_fetch($sth);
+    my $result = $self->_fetch($sth, $slice);
     push(@result, @$result);
   }
 
@@ -240,9 +241,77 @@ sub fetch_all_by_Slice {
 }
 
 
+=head2 fetch_pairs_by_Slice
+
+  Arg [1]    : Bio::EnsEMBL::Slice
+  Arg [2]    : (optional) ditag type (specific library)
+  Arg [3]    : (optional) analysis logic_name
+  Example    : my $ditagfeatures = $dfa->fetch_pairs_by_Slice($slice);
+               foreach my $ditagfeature (@$ditagfeatures){
+                 $minstart   = $$ditagfeature2{'start'};
+                 $maxend     = $$ditagfeature2{'end'};
+                 $bothstrand = $$ditagfeature2{'strand'};
+                 $tag_count  = $$ditagfeature2{'tag_count'};
+                 print "$minstart, $maxend, $bothstrand, $tag_count\n";
+               }
+  Description: Retrieves ditagFeature information in pairs from the database overlapping a specific region
+               and (optional) of a specific ditag type or analysis. The absotute start and end points are
+               fetched.
+               Slices should be SMALL!
+  Returntype : array ref with hash ref of artifical DitagFeature object
+  Caller     : general
+
+=cut
+
+sub fetch_pairs_by_Slice {
+  my ($self, $slice, $tagtype, $logic_name) = @_;
+  my ($tag_id, $pair_id, $seq_region_id, $start, $end, $strand, $analysis_id, $tag_count);
+  my @result;
+
+  my $sql = "SELECT df.ditag_id, df.ditag_pair_id, df.seq_region_id, MIN(df.seq_region_start), ".
+            "MAX(df.seq_region_end), df.seq_region_strand, df.analysis_id, d.tag_count ".
+            "FROM ditag_feature df, ditag d ".
+            "WHERE df.ditag_id=d.ditag_id ";
+  if($tagtype){
+    $sql .= "AND d.type = \"".$tagtype."\"";
+  }
+  $sql .= " AND df.seq_region_id = ".$slice->get_seq_region_id.
+          " AND df.seq_region_start <= ".$slice->end.
+	  " AND df.seq_region_end >= ".$slice->start;
+  if($logic_name){
+    my $analysis = $self->db->get_AnalysisAdaptor->fetch_by_logic_name($logic_name);
+    if(!$analysis) {
+      return undef;
+    }
+    $sql .= " AND df.analysis_id = ".$analysis->dbID();
+  }
+  $sql .= " GROUP BY df.ditag_id, df.ditag_pair_id;";
+
+  my $sth = $self->prepare($sql);
+  $sth->execute();
+  $sth->bind_columns( \$tag_id, \$pair_id, \$seq_region_id, \$start, \$end, \$strand, \$analysis_id ,\$tag_count);
+  while ( $sth->fetch ) {
+    my %ditag_pair = (
+                      ditag     => $tag_id,
+                      pair_id   => $pair_id,
+                      region    => $seq_region_id,
+                      start     => $start,
+                      end       => $end,
+                      strand    => $strand,
+                      analysis  => $analysis_id,
+                      tag_count => $tag_count
+                     );
+    push(@result, \%ditag_pair);
+  }
+
+  return \@result;
+}
+
+
 =head2 _fetch
 
   Arg [1]    : statement handler
+  Arg [2]    : (optional) target-slice for the feature
   Description: generic sql-fetch function for the DitagFeature fetch methods
   Returntype : listref of Bio::EnsEMBL::Map::DitagFeatures
   Caller     : private
@@ -250,7 +319,7 @@ sub fetch_all_by_Slice {
 =cut
 
 sub _fetch {
-  my ($self, $sth) = @_;
+  my ($self, $sth, $dest_slice) = @_;
 
   my ( $tag_id, $mothertag_id, $seqreg, $seqstart, $seqend, $strand, $analysis_id, $hit_start,
        $hit_end, $hit_strand, $cigar_line, $ditag_side, $ditag_pair_id );
@@ -260,13 +329,36 @@ sub _fetch {
                       \$hit_strand,    \$cigar_line,   \$ditag_side,
                       \$ditag_pair_id );
 
-  my @ditags;
+  my @ditag_features;
+  my $dest_slice_start;
+  my $dest_slice_end;
+  my $dest_slice_strand;
+  if($dest_slice) {
+    $dest_slice_start   = $dest_slice->start();
+    $dest_slice_end     = $dest_slice->end();
+    $dest_slice_strand  = $dest_slice->strand();
+  }
 
   while ( $sth->fetch ) {
     my $analysis_obj = $self->db->get_AnalysisAdaptor->fetch_by_dbID($analysis_id);
     my $slice        = $self->db->get_SliceAdaptor->fetch_by_seq_region_id($seqreg);
 
-    push @ditags,
+    if($dest_slice) {
+      if($dest_slice_start != 1 || $dest_slice_strand != 1) {
+        if($dest_slice_strand == 1) {
+          $seqstart    = $seqstart  - $dest_slice_start + 1;
+          $seqend      = $seqend    - $dest_slice_start + 1;
+        } else {
+          my $tmp_seq_region_start = $seqstart;
+          $seqstart    = $dest_slice_end - $seqend + 1;
+          $seqend      = $dest_slice_end - $tmp_seq_region_start + 1;
+          $strand     *= -1;
+        }
+	$slice = $dest_slice;
+      }
+    }
+
+    push @ditag_features,
       Bio::EnsEMBL::Map::DitagFeature->new( -dbid          => $tag_id,
                                             -slice         => $slice,
                                             -start         => $seqstart,
@@ -280,11 +372,12 @@ sub _fetch {
                                             -cigar_line    => $cigar_line,
                                             -ditag_side    => $ditag_side,
 					    -ditag_pair_id => $ditag_pair_id,
+					    -ditag         => undef,
                                             -adaptor       => $self,
                                             );
   }
 
-  return \@ditags;
+  return \@ditag_features;
 }
 
 
diff --git a/modules/Bio/EnsEMBL/Map/DitagFeature.pm b/modules/Bio/EnsEMBL/Map/DitagFeature.pm
index 7f85fcc7a27ffe650c9aa6b8c306c232f3086309..cc0b4bbf9cf2f0762ad852aa5fe465b50fa255d5 100644
--- a/modules/Bio/EnsEMBL/Map/DitagFeature.pm
+++ b/modules/Bio/EnsEMBL/Map/DitagFeature.pm
@@ -67,6 +67,7 @@ use Bio::EnsEMBL::Utils::Argument  qw( rearrange );
   Arg [15]   : (optional) int tag_count, only used for imported mappings where
                identical positions where collapsed into into one feature.
                Default: 1
+  Arg [16]   : (optional) ditag object
 
   Example    : $ditag = Bio::EnsEMBL::Map::DitagFeature->new
                             (-dbID => 123, -adaptor => $adaptor, ...);
@@ -79,9 +80,9 @@ use Bio::EnsEMBL::Utils::Argument  qw( rearrange );
 sub new {
   my ($caller, @args) = @_;
   my ( $dbID, $adaptor, $start, $end, $strand, $slice, $analysis, $hit_start, $hit_end, 
-       $hit_strand, $ditag_id, $ditag_side, $cigar_line, $ditag_pair_id, $tag_count ) = rearrange( 
-												  [ 'dbid', 'adaptor' ,'start', 'end', 'strand', 'slice', 'analysis', 'hit_start', 
-	'hit_end', 'hit_strand', 'ditag_id', 'ditag_side', 'cigar_line', 'ditag_pair_id' ,'tag_count'],
+       $hit_strand, $ditag_id, $ditag_side, $cigar_line, $ditag_pair_id, $tag_count, $ditag  ) =
+	 rearrange( [ 'dbid', 'adaptor' ,'start', 'end', 'strand', 'slice', 'analysis', 'hit_start',
+	'hit_end', 'hit_strand', 'ditag_id', 'ditag_side', 'cigar_line', 'ditag_pair_id' ,'tag_count', 'ditag'],
        @args );
   my $class = ref($caller) || $caller;
 
@@ -131,6 +132,7 @@ sub new {
                      'ditag_side'    => $ditag_side,
                      'cigar_line'    => $cigar_line,
 		     'tag_count'     => $tag_count,
+		     'ditag'         => $ditag,
                     }, $class);
 
   return $self;
@@ -139,21 +141,37 @@ sub new {
 
 =head2 fetch_ditag
 
-  Arg [1]    : none
-  Description: Get the ditag object of this DitagFeature
+  Description: Deprecated, use ditag() instead
+
+=cut
+
+sub fetch_ditag {
+  throw("Deprecated method, please use ditag() instead.\n")
+}
+
+
+=head2 ditag
+
+  Arg [1]    : (optional) ditag object
+  Description: Get/Set the ditag object of this DitagFeature
   Returntype : Bio::EnsEMBL::Map::Ditag
   Exceptions : none
   Caller     : general
 
 =cut
 
-sub fetch_ditag {
+sub ditag {
   my $self = shift;
 
-  my $ditag_adaptor = $self->adaptor->db->get_DitagAdaptor;
-  my $ditag = $ditag_adaptor->fetch_by_dbID($self->ditag_id);
+  if(@_) {
+    $self->{'ditag'} = shift;
+  } elsif(!$self->{'ditag'} && $self->{'adaptor'} && $self->{'ditag_id'}) {
+    #lazy load the ditag
+    my $ditag_adaptor = $self->adaptor->db->get_DitagAdaptor;
+    $self->{'ditag'}   = $ditag_adaptor->fetch_by_dbID($self->ditag_id);
+  }
 
-  return $ditag;
+  return $self->{'ditag'};
 }