diff --git a/Osstest/Debian.pm b/Osstest/Debian.pm
index 01930e1f..05cc6e1f 100644
--- a/Osstest/Debian.pm
+++ b/Osstest/Debian.pm
@@ -22,6 +22,7 @@ use warnings;
 
 use POSIX;
 
+use Carp;
 use IO::File;
 use File::Copy;
 use File::Basename;
@@ -35,6 +36,8 @@ BEGIN {
     $VERSION     = 1.00;
     @ISA         = qw(Exporter);
     @EXPORT      = qw(debian_boot_setup
+		      debian_mirror_url debian_mirror_host_path
+		      debian_mirror_url_suite_arch
                       di_installer_path di_special_kernel
                       setupboot_bootloader_edited_rune
                       debian_overlays debian_overlays_fixup_cmd
@@ -811,12 +814,36 @@ chmod 600 $subdir/etc/ssh/ssh_host_*_key ||:
 END
 }
 
+sub debian_mirror_url ($) {
+    # I think ideally this should handle, and be used for, backports too.
+    # It would need an optional suite suffix which could be "-backports"?
+    my ($ho) = @_;
+    my $suite = $ho->{Suite};
+    my $arch = $ho->{Arch};
+    my $url =
+      $c{"DebianMirror_${suite}_${arch}"} //
+      $c{"DebianMirror_${suite}"} //
+      $c{"DebianMirror"};
+    if (!defined $url) {
+	$url = "http://$c{DebianMirrorHost}/$c{DebianMirrorSubpath}";
+    }
+    return $url;
+}
+
+sub debian_mirror_host_path ($) {
+    my ($ho) = @_;
+    my $url = debian_mirror_url($ho);
+    $url =~ m{^http://([^/]+)/(.*)$} or
+      confess "unsupported Debian url (needs to be http://HOST/...): $url";
+    return ($1, $2);
+}
+
 sub preseed_backports_packages ($$$$@) {
     my ($ho, $sfx, $xopts, $suite, @pkgs) = @_;
 
     if (! $xopts->{BackportsSourcesAlreadyAdded}++) {
 	my $bp_url = $c{"DebianSnapshotBackports_$suite"};
-	$bp_url ||= "http://$c{DebianMirrorHost}/$c{DebianMirrorSubpath}";
+	$bp_url ||= debian_mirror_url($ho);
 
 	my $apt_insert='';
 	my $extra_rune='';
@@ -942,6 +969,8 @@ END
     preseed_hook_command($ho, 'late_command', $sfx,
 			 debian_dhcp_rofs_fix($ho, '/target'));
 
+    my ($mhost, $mpath) = debian_mirror_host_path($ho);
+
     my $preseed = <<"END";
 d-i debian-installer/locale string en_GB
 d-i console-keymaps-at/keymap select gb
@@ -1001,9 +1030,9 @@ d-i finish-install/keep-consoles boolean true
 d-i finish-install/reboot_in_progress note
 d-i cdrom-detect/eject boolean false
 
-d-i mirror/http/hostname string $c{DebianMirrorHost}
+d-i mirror/http/hostname string $mhost
+d-i mirror/http/directory string /$mpath
 d-i mirror/http/proxy string $c{DebianMirrorProxy}
-d-i mirror/http/directory string /$c{DebianMirrorSubpath}
 d-i apt-setup/use_mirror boolean yes
 d-i apt-setup/another boolean false
 d-i apt-setup/non-free boolean false
diff --git a/README b/README
index 33c4d2cc..20d9802a 100644
--- a/README
+++ b/README
@@ -398,6 +398,10 @@ DebianMirrorProxy
    The apt proxy to specify for Debian (and derivatives),
    eg http://apt-cacher:3142/ .
 
+DebianMirror[_<suite>[_<arch>]]
+   Overrides DebianMirrorHost and DebianMirrorSubpath, optionally
+   for specific suite and arch.
+
 TestHost <hostname>
 TestHost_<ident> <hostname>
    Specifies the test box to use.  Should be a bare hostname,
diff --git a/make-distros-flight b/make-distros-flight
index 406d7d64..47094ef5 100755
--- a/make-distros-flight
+++ b/make-distros-flight
@@ -74,6 +74,8 @@ test_do_one_netboot () {
   else
     #local mirror="http://`getconfig DebianMirrorHost`/`getconfig DebianMirrorSubpath`"
     # XXX local mirror seems to serve up stale files.
+    # ^ this should use debian_mirror_url, not plain config, so it
+    #   honours suite- and arch- specific settings
     local mirror="http://ftp.debian.org/debian"
     diurl="$mirror/dists/$guest_suite/main/installer-$domU/current/images/netboot"
     gver=$guest_suite
diff --git a/production-config b/production-config
index df32e863..e7009a55 100644
--- a/production-config
+++ b/production-config
@@ -126,9 +126,6 @@ CoverityUploadUrl https://scan.coverity.com/builds?project=XenProject
 CoverityTools cov-analysis-linux64-2019.03.tar.gz
 CoverityToolsStripComponents 1
 
-# We use the IP address because Citrix can't manage reliable nameservice
-#DebianMirrorHost debian.uk.xensource.com
-#DebianMirrorHost 10.80.16.196
 DebianMirrorProxy http://cache:3143/
 
 HostProp_DhcpWatchMethod leases dhcp3 infra.t:5556
diff --git a/ts-debian-install b/ts-debian-install
index 8caa9d76..c42e8a37 100755
--- a/ts-debian-install
+++ b/ts-debian-install
@@ -83,12 +83,14 @@ END
     $cmd .= <<END if defined $useproxy;
         http_proxy=$useproxy \\
 END
+    my $mirror = debian_mirror_url($gho);
+
     $cmd .= <<END;
         xen-create-image \\
             --dhcp --mac $gho->{Ether} \\
             --memory ${ram_mb}Mb --swap ${swap_mb}Mb \\
             --dist $gsuite \\
-            --mirror http://$c{DebianMirrorHost}/$c{DebianMirrorSubpath} \\
+            --mirror $mirror \\
             --hostname $gho->{Name} \\
             --lvm $gho->{Vg} --force \\
             --kernel $kernpath \\
