diff --git a/modules/Bio/EnsEMBL/DBSQL/DataFileAdaptor.pm b/modules/Bio/EnsEMBL/DBSQL/DataFileAdaptor.pm
index 7c0e2054a4b7aa572cf1f38220ae66ea0764c4c0..d28e375f529cc83ef5ba935ad373794b1c7160bc 100644
--- a/modules/Bio/EnsEMBL/DBSQL/DataFileAdaptor.pm
+++ b/modules/Bio/EnsEMBL/DBSQL/DataFileAdaptor.pm
@@ -55,6 +55,48 @@ use Bio::EnsEMBL::DBSQL::BaseAdaptor;
 use Bio::EnsEMBL::Utils::Exception qw/throw warning/;
 use Bio::EnsEMBL::Utils::Scalar qw/:assert/;
 
+my $GLOBAL_BASE_PATH;
+
+=head2 global_base_path
+
+  Arg[1]     	: String; base path 
+  Example			: Bio::EnsEMBL::DBSQL::DataFileAdaptor->global_base_path('/base/path');
+  Description	: Stores a global value to be used when building data file paths
+  Returntype 	: String
+  Exceptions 	: None
+
+=cut
+
+sub global_base_path {
+  my ($class, $base_path) = @_;
+  return $GLOBAL_BASE_PATH unless $base_path;
+  $GLOBAL_BASE_PATH = $base_path;
+  return $GLOBAL_BASE_PATH;
+}
+
+=head2 get_base_path
+
+  Arg[1]      : String; (optional) base path 
+  Example     : $dfa->get_base_path();
+  Description : If given the path it will return that path; if not it consults
+                $self->global_base_path() for a value. As a last resort
+                it will look at the meta table for an entry keyed by
+                B<data_file.base_path>
+  Returntype  : String
+  Exceptions  : Thrown if nothing is found after consulting all three locations
+
+=cut
+
+sub get_base_path {
+  my ($self, $path) = @_;
+  return $path if defined $path;
+  my $global_base_path = $self->global_base_path();
+  return $global_base_path if defined $global_base_path;
+  my $meta_base_path = $self->db()->get_MetaContainer()->single_value_by_key('data_file.base_path', 1);
+  return $meta_base_path if defined $meta_base_path;
+  throw "No base path discovered. Either provide a path, set a global using global_base_path() or specify 'data_file.base_path' in meta";
+}
+
 =head2 DataFile_to_extension
 
   Arg[1]      : Bio::EnsEMBL::DataFile
diff --git a/modules/Bio/EnsEMBL/DataFile.pm b/modules/Bio/EnsEMBL/DataFile.pm
index 48820b7b8dd90714b05d0d2f2136568e023f6f2c..230277f57e611e50d0b84554d8228183b4e02129 100644
--- a/modules/Bio/EnsEMBL/DataFile.pm
+++ b/modules/Bio/EnsEMBL/DataFile.pm
@@ -67,6 +67,23 @@ sub new_fast {
   return $self;
 }
 
+=head2 get_ExternalAdaptor
+
+  Arg[1]     	: Scalar; optional base path. Uses defaults if not given 
+  Example			: my $ea = $df->get_ExternalAdaptor('/base/path');
+  Description	: Delegates to the parent adaptor to retrieve the external 
+                adaptor for this data type
+  Returntype 	: Any; will be an adaptor that can read the given data file
+  Exceptions 	: Thrown if there is no attached adaptor. Otherwise 
+
+=cut
+
+sub get_ExternalAdaptor {
+  my ($self, $base_path) = @_;
+  my $adaptor = $self->adaptor();
+  throw "No DataFileAdaptor found in this object. Cannot request ExternalAdaptor" if ! $adaptor;
+  return $adaptor->DataFile_to_adaptor($self, $base_path);
+}
 
 =head2 path
 
@@ -75,7 +92,12 @@ sub new_fast {
   Example			: my $f = $df->path();
   Description	: Used to generate the path to the file resource. Can return a
                 path to the file or a URL but it is up to the using code to
-                know how to interprate the different returned forms
+                know how to interprate the different returned forms.
+                
+                If the data file url is canonical then this is just returned. 
+                If not then a path is generated of the form 
+                B</base/path/production_name/coord_system_version/[software_version/]db_group/name.ext> 
+                
   Returntype 	: Scalar the absolute path/url to the given resource
   Exceptions 	: Thrown if the linked Coordinate System lacks a version and the
                 current database also lacks a default version
@@ -87,12 +109,9 @@ sub new_fast {
 sub path {
   my ($self, $base) = @_;
   
-  if($self->absolute()) {
-    return $self->url();
-  }
-  if(! $base) {
-    throw 'No base given';
-  }
+  return $self->url() if $self->absolute();
+  
+  $base = $self->adaptor()->get_base_path($base) if ! $base;
 
   my $production_name = $self->adaptor()->db()->get_MetaContainer()->get_production_name();
   my $cs_version = $self->coord_system()->version();