diff --git a/lib/rmt/cli/export.rb b/lib/rmt/cli/export.rb
index edc666edc..d8265e1f5 100644
--- a/lib/rmt/cli/export.rb
+++ b/lib/rmt/cli/export.rb
@@ -34,7 +34,7 @@ def repos(path)
     begin
       suma_product_tree.mirror
     rescue RMT::Mirror::Exception => e
-      logger.warn(e.message)
+      logger.warn(_('Exporting SUSE Manager product tree failed: %{error_message}') % { error_message: e.message })
     end
 
     repos_file = File.join(path, 'repos.json')
diff --git a/lib/rmt/cli/import.rb b/lib/rmt/cli/import.rb
index a51d9cd58..1ca7dba2b 100644
--- a/lib/rmt/cli/import.rb
+++ b/lib/rmt/cli/import.rb
@@ -25,7 +25,7 @@ def repos(path)
           url: suma_repo_url
         ).mirror
       rescue RMT::Mirror::Exception => e
-        logger.warn(e.message)
+        logger.warn(_('Importing suma product tree failed: %{error_message}') % { error_message: e.message })
       end
 
       repos = JSON.parse(File.read(repos_file))
diff --git a/lib/rmt/mirror.rb b/lib/rmt/mirror.rb
index 8c3436c16..1c71d1f5d 100644
--- a/lib/rmt/mirror.rb
+++ b/lib/rmt/mirror.rb
@@ -37,6 +37,9 @@ def repository_mirror_class
   end
 
   def repository_type
+    # We search repomd structure first since it is more common
+    # Debian is less common
+
     search = {
       repomd: File.join(repository.external_url, RPM_FILE_NEEDLE),
       debian: File.join(repository.external_url, DEB_FILE_NEEDLE)
diff --git a/lib/rmt/mirror/base.rb b/lib/rmt/mirror/base.rb
index 27412e4fb..7a20b2c56 100644
--- a/lib/rmt/mirror/base.rb
+++ b/lib/rmt/mirror/base.rb
@@ -80,7 +80,6 @@ def repository_path(*args)
     File.join(mirroring_base_dir, repository.local_path, *args)
   end
 
-  # FIXME: Write some specs for me!
   def create_repository_path
     FileUtils.mkpath(repository_path) unless Dir.exist?(repository_path)
   rescue StandardError => e
@@ -111,8 +110,8 @@ def cleanup_temp_dirs
     @temp_dirs = {}
   end
 
-  def enqueue(ref)
-    @enqueued << ref
+  def enqueue(refs)
+    @enqueued.concat(Array(refs))
   end
 
   def download_enqueued(continue_on_error: false)
@@ -155,7 +154,7 @@ def replace_directory(source:, destination:, with_backup: true, &block)
 
   def copy_directory_content(source:, destination:)
     replace_directory(source: source, destination: destination, with_backup: false) do
-      FileUtils.mv(Dir.glob(source), destination)
+      FileUtils.mv(Dir.glob(source), destination, force: true)
     end
   end
 end
diff --git a/lib/rmt/mirror/debian.rb b/lib/rmt/mirror/debian.rb
index 351958169..009623e94 100644
--- a/lib/rmt/mirror/debian.rb
+++ b/lib/rmt/mirror/debian.rb
@@ -3,6 +3,8 @@ class RMT::Mirror::Debian < RMT::Mirror::Base
   SIGNATURE_FILE_NAME = 'Release.gpg'.freeze
   KEY_FILE_NAME = 'Release.key'.freeze
   INRELEASE_FILE_NAME = 'InRelease'.freeze
+  NESTED_REPOSITORY_REGEX = %r{/dists/.*/$}.freeze
+  DETECT_NONMANDATORY_FILES = %r{/(Packages|Sources|Translation)(-\w+)?$/}.freeze
 
   def mirror_implementation
     create_repository_path
@@ -28,9 +30,17 @@ def mirror_metadata
     # We need to make sure downloading the InRelease file which is not referenced
     # anywhere
     metadata_refs << inrelease
-    metadata_refs.each { |ref| enqueue(ref) }
 
+    # The nested debian structure only contains the zipped version of packages sometimes
+    # However, the release file still contains a reference to the unzipped versions
+    # So, we don't error if they don't exist
+    packages, remaining = metadata_refs.partition { |ref| ref.relative_path.match(DETECT_NONMANDATORY_FILES) }
+    enqueue(packages)
+    download_enqueued(continue_on_error: true)
+
+    enqueue(remaining)
     download_enqueued
+
     metadata_refs
   end
 
@@ -60,6 +70,17 @@ def parse_package_list(packagelist)
         ref.size = current[:size].to_i
         ref.type = :deb
 
+        # In a nested debian repository stucture, the metadata and packages are stored in different locations
+        # so we need to update the base_url if we encounter the nested structure
+        # We assume that if the base_url contains '/dists/', it's a nested debian structure
+        if ref.base_url.match?(NESTED_REPOSITORY_REGEX)
+          ref.tap do |r|
+            r.base_url.sub!(NESTED_REPOSITORY_REGEX, '/')
+            r.base_dir.sub!(NESTED_REPOSITORY_REGEX, '/')
+            r.cache_dir.sub!(NESTED_REPOSITORY_REGEX, '/')
+          end
+        end
+
         packages << ref
         current = {}
       end
diff --git a/lib/rmt/mirror/license.rb b/lib/rmt/mirror/license.rb
index 4bcc7a05f..be4dc546b 100644
--- a/lib/rmt/mirror/license.rb
+++ b/lib/rmt/mirror/license.rb
@@ -18,6 +18,7 @@ def licenses_available?
     end
     request.run
 
+    logger.debug("No license directory found for repository '#{uri}'")
     false
   end
 
diff --git a/spec/fixtures/files/debian/nested/Packages.gz b/spec/fixtures/files/debian/nested/Packages.gz
new file mode 100644
index 000000000..d3744b96b
Binary files /dev/null and b/spec/fixtures/files/debian/nested/Packages.gz differ
diff --git a/spec/fixtures/files/debian/nested/Release b/spec/fixtures/files/debian/nested/Release
new file mode 100644
index 000000000..994d6a636
--- /dev/null
+++ b/spec/fixtures/files/debian/nested/Release
@@ -0,0 +1,247 @@
+Origin: LP-PPA-ondrej-nginx
+Label: PPA for NGINX Stable with HTTP/2
+Suite: focal
+Version: 20.04
+Codename: focal
+Date: Fri, 26 May 2023  6:27:05 UTC
+Architectures: amd64 arm64 armhf i386 ppc64el riscv64 s390x
+Components: main
+Description: Ubuntu Focal 20.04
+MD5Sum:
+ 981e4c2e020d5475bd5777f729031621            29008 main/binary-amd64/Packages
+ 6ada021f2fe814338373c5a673c1c6b2             6419 main/binary-amd64/Packages.gz
+ 9bca98c20b2144ee04c50e4e264db472             5888 main/binary-amd64/Packages.xz
+ 84af87c4c8bf68f1fcbf02582b5ce913              134 main/binary-amd64/Release
+ c007d99ef2dde4bf29d93f21d0f185e0            29012 main/binary-arm64/Packages
+ e3fee760a2f822199332f8958936afc8             6419 main/binary-arm64/Packages.gz
+ 675add161dec2c4631b12c9b29f3667f             5888 main/binary-arm64/Packages.xz
+ 939331613d2fb545cda2f5676de1c1f1              134 main/binary-arm64/Release
+ e98e5de578d289c3f3ee8f966809c213            28987 main/binary-armhf/Packages
+ 0a03f421a376d4aceb756bbe272053ac             6416 main/binary-armhf/Packages.gz
+ b6d4270c8e60192983c3f0cfbd1db77b             5892 main/binary-armhf/Packages.xz
+ f84736f614b57271e3d22a3951a19d2d              134 main/binary-armhf/Release
+ fd7f16dc03cd8a2d268fe79eea2704c5             6104 main/binary-i386/Packages
+ 53ca7c17d1ead2cc686731b4a1409396             1948 main/binary-i386/Packages.gz
+ 3271ae3116b9534ceb8474930936bfb3             1956 main/binary-i386/Packages.xz
+ 2e1a91fb5c7eb14df241b1e166669076              133 main/binary-i386/Release
+ 8d3678e87822ab86d31822c2b8d52799            29155 main/binary-ppc64el/Packages
+ 1afd795683b1730c1a5d4c79717294fe             6412 main/binary-ppc64el/Packages.gz
+ 9d0303aff7cfa5a69f2e2b6edf3a6d33             5888 main/binary-ppc64el/Packages.xz
+ 21159d15afb4176c1213c114818e4a7c              136 main/binary-ppc64el/Release
+ 6a142d4c73c3de4bd7a158224b54ae75             3486 main/binary-riscv64/Packages
+ 10cc0dbdcf2876118f69a9e6d6e6fe0e             1136 main/binary-riscv64/Packages.gz
+ fec587d40efdc9f9453caf4b076a967f             1196 main/binary-riscv64/Packages.xz
+ 57bd194347cd7044aae39becf8c8d8e0              136 main/binary-riscv64/Release
+ 6a142d4c73c3de4bd7a158224b54ae75             3486 main/binary-s390x/Packages
+ 10cc0dbdcf2876118f69a9e6d6e6fe0e             1136 main/binary-s390x/Packages.gz
+ fec587d40efdc9f9453caf4b076a967f             1196 main/binary-s390x/Packages.xz
+ 714ddb4d49a18cc6303ac88f5d333071              134 main/binary-s390x/Release
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-amd64/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-amd64/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-amd64/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-arm64/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-arm64/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-arm64/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-armhf/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-armhf/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-armhf/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-i386/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-i386/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-i386/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-ppc64el/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-ppc64el/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-ppc64el/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-riscv64/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-riscv64/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-riscv64/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debian-installer/binary-s390x/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debian-installer/binary-s390x/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debian-installer/binary-s390x/Packages.xz
+ 29d21cda14d75364d4fbb3355bd5ba40            25018 main/debug/binary-amd64/Packages
+ 4ac2959903ff3d6b528a21d6e5b4c011             5749 main/debug/binary-amd64/Packages.gz
+ 8bbfe12fd0c138b30ee2af0b87c7b288             5196 main/debug/binary-amd64/Packages.xz
+ 86f234a20296a1d01cb3fe8034667b00            25018 main/debug/binary-arm64/Packages
+ 0e4ba42f4baaa2ee12202477060e8ddc             5769 main/debug/binary-arm64/Packages.gz
+ 7b07d584e20aa5b36ace351607735bac             5220 main/debug/binary-arm64/Packages.xz
+ 1ec9c36b0ea93e7dea98f09adc1f8707            25018 main/debug/binary-armhf/Packages
+ d74367f4d3c5677a8fc7f92639058d76             5747 main/debug/binary-armhf/Packages.gz
+ 5e5cbb7f5e5d4222a01ab46e19d63f80             5220 main/debug/binary-armhf/Packages.xz
+ f08b9fb6c7399c68f8f030f5d6b09c7c             2310 main/debug/binary-i386/Packages
+ 6d7018fc7e0555fb38e7353ba3a4fe09              898 main/debug/binary-i386/Packages.gz
+ 2618090a38f4d10415227b29e5570b99              936 main/debug/binary-i386/Packages.xz
+ b25ad9e4cb17837d2de8116b4b5ba907            25138 main/debug/binary-ppc64el/Packages
+ 7e7af3a9a7b79c0efa8bfa947c6ed00e             5763 main/debug/binary-ppc64el/Packages.gz
+ a960a106b6786d9d704ba820faa2c5f4             5204 main/debug/binary-ppc64el/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debug/binary-riscv64/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debug/binary-riscv64/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debug/binary-riscv64/Packages.xz
+ d41d8cd98f00b204e9800998ecf8427e                0 main/debug/binary-s390x/Packages
+ fa9ac5a217b5547bc7dd4e6e894fe135               20 main/debug/binary-s390x/Packages.gz
+ 8dc5aea5b03dff8595f096f9e368e888               32 main/debug/binary-s390x/Packages.xz
+ 9d2bb1e8a4dad6c79b8591b8efe047b4              201 main/i18n/Index
+ 0508faa634d3fa9644d31ac334fd1ef7            22237 main/i18n/Translation-en
+ 7596563fa51ed6a2a0c22b46b36e3c8f             6367 main/i18n/Translation-en.gz
+ a96f01ca2262e16a8665176c0a0ed9fb             6104 main/i18n/Translation-en.xz
+ d0f5ef2d6ab566c9b2896e3090bbfbff              135 main/source/Release
+ fb3bbd7ba98d272ecfe6de3150601a81             6376 main/source/Sources
+ a52a826380a399d6a46a0e868190c6d7             1988 main/source/Sources.gz
+ 483f7cc86349f109d7852cfad31244e0             1980 main/source/Sources.xz
+SHA1:
+ 7dbf83e8cdeffa8d285f02bc6a3b7c3401c731fe            29008 main/binary-amd64/Packages
+ 42bbbea0e89d5617336ed77932d98e0125b313e0             6419 main/binary-amd64/Packages.gz
+ 3b0f33025b5c23173ecd964579e44786fb59e044             5888 main/binary-amd64/Packages.xz
+ 073c3a508f1a7c0d0eaabe90c8b92f71a282eefb              134 main/binary-amd64/Release
+ 6f5bc2660c5a28db5243453a20e7bd83969f551e            29012 main/binary-arm64/Packages
+ f3ddb8ffcc7ad8d0d31145ac23d1235b06189dda             6419 main/binary-arm64/Packages.gz
+ 0487913ecb36df1d87bc42c2937073a771c067ee             5888 main/binary-arm64/Packages.xz
+ 7b51e81aa38daac027bb404899f552176933fa29              134 main/binary-arm64/Release
+ 80470be8395380648fb6cc399a7fc3e030a03100            28987 main/binary-armhf/Packages
+ 80de1b12afb36973528e7f57be8958b24d9f4988             6416 main/binary-armhf/Packages.gz
+ fb2600cb259cf8dae132f60d0437f5a5343d30dd             5892 main/binary-armhf/Packages.xz
+ fec206b6af21360582dfad81e74aa1d7c282c1f2              134 main/binary-armhf/Release
+ 6e476c133eeae8235301896a09384a5eabfebe52             6104 main/binary-i386/Packages
+ 89e9309543b217defbc4f9128c83bd79e966c53e             1948 main/binary-i386/Packages.gz
+ c4d7ef2f558262f95374b0e2f65bb5ed40e1334b             1956 main/binary-i386/Packages.xz
+ 519def120d2562d22dd5653e0ab017cb12a62fab              133 main/binary-i386/Release
+ 74685ba30eb67550b925434cba04419547798be8            29155 main/binary-ppc64el/Packages
+ be8983257a1dbebf575f0653b2c9b2cad25094ca             6412 main/binary-ppc64el/Packages.gz
+ 0b69336a50fb3c5f0642a1077ade32b6a11de291             5888 main/binary-ppc64el/Packages.xz
+ c078d934eb9fcd89ad9ec6c60bd14a67c41e78ec              136 main/binary-ppc64el/Release
+ 1dd4ec2925bc96d4280c3860494339359067a0b8             3486 main/binary-riscv64/Packages
+ c6697615bcea3f76bd483c06167b7aa651aaf8aa             1136 main/binary-riscv64/Packages.gz
+ 066056e9cbd492e4316d170f8d6f64474c60161a             1196 main/binary-riscv64/Packages.xz
+ 63e3b27ae80db472d30eb55a7cceb8da49f96377              136 main/binary-riscv64/Release
+ 1dd4ec2925bc96d4280c3860494339359067a0b8             3486 main/binary-s390x/Packages
+ c6697615bcea3f76bd483c06167b7aa651aaf8aa             1136 main/binary-s390x/Packages.gz
+ 066056e9cbd492e4316d170f8d6f64474c60161a             1196 main/binary-s390x/Packages.xz
+ f94dac699569fb3ed00607b09075397537600cf9              134 main/binary-s390x/Release
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-amd64/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-amd64/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-amd64/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-arm64/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-arm64/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-arm64/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-armhf/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-armhf/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-armhf/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-i386/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-i386/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-i386/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-ppc64el/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-ppc64el/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-ppc64el/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-riscv64/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-riscv64/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-riscv64/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debian-installer/binary-s390x/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debian-installer/binary-s390x/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debian-installer/binary-s390x/Packages.xz
+ 8228cfdd7d0c848b0782d6890bcb6315b8a9a198            25018 main/debug/binary-amd64/Packages
+ 4d03307b0f3054591c7af1bcc03d9e66e6a2f979             5749 main/debug/binary-amd64/Packages.gz
+ 2356d87c0a1daadb8925c5aac2fc13d454785444             5196 main/debug/binary-amd64/Packages.xz
+ 5230b4e3e00f4cb06c41cbc4e9fa8225063aa033            25018 main/debug/binary-arm64/Packages
+ 30515603e2f5a19e5bc6f8d94f76b956fa9acf7b             5769 main/debug/binary-arm64/Packages.gz
+ f72d63d70a492f3a68fd7dd1f96a8b73d34a62c6             5220 main/debug/binary-arm64/Packages.xz
+ bea33a15fb9f61c872c502abb39209b21b3172b9            25018 main/debug/binary-armhf/Packages
+ d9210cb8f555d4cb6f28e7a17545ff68c27a2970             5747 main/debug/binary-armhf/Packages.gz
+ e564780fcc0a42b1deb27657d652c9d1f3a5600e             5220 main/debug/binary-armhf/Packages.xz
+ 2d8f585e0b6a6cee3d9cc0f4e51ec0c7fa2a8a57             2310 main/debug/binary-i386/Packages
+ 06b07ca65b4c65a07a60bfcd032c8489c342765c              898 main/debug/binary-i386/Packages.gz
+ 4122a5a6193cdd3ecffeb6e1f820341c5b1bca33              936 main/debug/binary-i386/Packages.xz
+ 3be6bce33adc89fc127eade07d6277de31f1b60e            25138 main/debug/binary-ppc64el/Packages
+ 93809d71b5cc2c4f8e4319eb098ce9f1933701c0             5763 main/debug/binary-ppc64el/Packages.gz
+ dcbd113bde6073ccfcd05f6297762d99f6287c91             5204 main/debug/binary-ppc64el/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debug/binary-riscv64/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debug/binary-riscv64/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debug/binary-riscv64/Packages.xz
+ da39a3ee5e6b4b0d3255bfef95601890afd80709                0 main/debug/binary-s390x/Packages
+ 89892054d65b8b0dd6a081b33a97b6f2bd1fa267               20 main/debug/binary-s390x/Packages.gz
+ 9746882f4236fa1c3a8f86be2f1d9c46680c0b10               32 main/debug/binary-s390x/Packages.xz
+ 0deb7607a910cd17a05d8f0868d7e42ef1fa63bf              201 main/i18n/Index
+ ea7790fa38613fc67895a31632db8040aabecaf8            22237 main/i18n/Translation-en
+ 3a93ea38456709e95161485dd0a9367101222b33             6367 main/i18n/Translation-en.gz
+ 2499ac6b0369a515853c8247bfdd8d79054d4841             6104 main/i18n/Translation-en.xz
+ 64e3312676d3bf4cf8ddf89b4a11acbd492df8ec              135 main/source/Release
+ 30d636af01d70eb5ba9261cb931045095c9ba4bf             6376 main/source/Sources
+ a274a2f4451b2e3f8d9bf87b339c994faa895ff6             1988 main/source/Sources.gz
+ 455299697da9ca492a6b66f33115a732b1919923             1980 main/source/Sources.xz
+SHA256:
+ 46d7bcf8e069c84a49123e9b70d317f99a189eacacc5e413a4c77856e54f788f            29008 main/binary-amd64/Packages
+ 9f8c4ece8742794c12a676158d8731b69b66b0766626270590ed09a01f65bfd3             6419 main/binary-amd64/Packages.gz
+ 207586b58affe7f867c471ffd9b63e80165053f6e54ee4a6d011b149fbfcf866             5888 main/binary-amd64/Packages.xz
+ b68e91c4b89dbe245fdef76c4efa09f5168948970f9b712ce93547222ca25bb3              134 main/binary-amd64/Release
+ 3afe05d9b12c2fc3bd8af4f06f2dce85fd32b9e1a4096d7cb7151fe36ef40365            29012 main/binary-arm64/Packages
+ 91c66887eefa4ae758e34ca9aa2c2b8cf1c48ceaadb999a3b7a67bb37b65b2ab             6419 main/binary-arm64/Packages.gz
+ fd26475212f801c28738efff64bc00977e5d30a09ec6d1574549a0431aff121f             5888 main/binary-arm64/Packages.xz
+ c39f2350a6c893090fa1162aa3281dbf8e591c154122a007c458b537298dcc0f              134 main/binary-arm64/Release
+ d2c02d68c59a7cbed3008d52f92b452a79949f2ca83e3fce59606091c3bfc267            28987 main/binary-armhf/Packages
+ 70b5e42def597e161558e9b67ee49d9378fe4ac80aa0280034e9c412e544616b             6416 main/binary-armhf/Packages.gz
+ ea9babc2bbd4a3e629ca22d0326e132b5535502c6863a74879bc4eee0a405698             5892 main/binary-armhf/Packages.xz
+ 0c7c3934800ac686bbd1324734f75645a524648c7779456291bd1d67f4720035              134 main/binary-armhf/Release
+ 206edb9a58c28b1c9a46fbf3e3451f81a8d10cc17374d8e201e6d8791d70a487             6104 main/binary-i386/Packages
+ 79391443843abee883a484ed4c07936cba3959ab4dade3852028428159b9c411             1948 main/binary-i386/Packages.gz
+ 323439e17b04db5fbdc44dea2895277596f2f5a3c36998410e3613c8450f8fa7             1956 main/binary-i386/Packages.xz
+ 4451595be754481c35f60469afb31ae169aa08b4be0134886e6b0615330051af              133 main/binary-i386/Release
+ c0ae699ba49cd84459ed9a08b7ee423f802617e889f26bcd955902ec5c6ef695            29155 main/binary-ppc64el/Packages
+ 2ee11bc55599681abda0b6480b8d59bf3009c13d0585b268652487bc4a72d486             6412 main/binary-ppc64el/Packages.gz
+ 2dbe2921df2d3cf3aed903a07c4f218a10d5d35a9e55b5bada8a0ef6f5566687             5888 main/binary-ppc64el/Packages.xz
+ b7a4a21d465320c4236bb9a2925b23a6df7b6cb92f638c93396aca965072eb2e              136 main/binary-ppc64el/Release
+ cde25cab3406f13557a82d944249bda1ee47b4664957b6eeb86121217433b2ed             3486 main/binary-riscv64/Packages
+ 1e86ab07bd8c98caf3c05f0a1091296be7e3faaa1cda1f764de8f4f26eea2d50             1136 main/binary-riscv64/Packages.gz
+ 8804e1312631b6603674df1ac27fdfaa8ccb00cd682cd8c937a30d7b0f32ff9c             1196 main/binary-riscv64/Packages.xz
+ 4d097996f75a8548bafddec01e04eae871e13f34fe1dd66e98b38e68149c08ed              136 main/binary-riscv64/Release
+ cde25cab3406f13557a82d944249bda1ee47b4664957b6eeb86121217433b2ed             3486 main/binary-s390x/Packages
+ 1e86ab07bd8c98caf3c05f0a1091296be7e3faaa1cda1f764de8f4f26eea2d50             1136 main/binary-s390x/Packages.gz
+ 8804e1312631b6603674df1ac27fdfaa8ccb00cd682cd8c937a30d7b0f32ff9c             1196 main/binary-s390x/Packages.xz
+ 46e21a856aff2287d16e31009478a90a70ff0d8516554ce21a57550940168ae1              134 main/binary-s390x/Release
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-amd64/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-amd64/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-amd64/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-arm64/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-arm64/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-arm64/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-armhf/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-armhf/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-armhf/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-i386/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-i386/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-i386/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-ppc64el/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-ppc64el/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-ppc64el/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-riscv64/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-riscv64/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-riscv64/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debian-installer/binary-s390x/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debian-installer/binary-s390x/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debian-installer/binary-s390x/Packages.xz
+ 9dd99bc9b479ae0e96f2f464ec3f61081c8a359968642ea90b09e516695764c6            25018 main/debug/binary-amd64/Packages
+ 7290c8d07e7439776c8bcf69e40fdb11467a4168cc4ee931138c9f056681679e             5749 main/debug/binary-amd64/Packages.gz
+ f925fc9cdf353e52c5ff0bb2a01a54030667d0102fa3fc58629e8bb601b89b0c             5196 main/debug/binary-amd64/Packages.xz
+ bcba848fbb00447ca549629c9855ee3f3afdc2d3ad08f6df6ce71732022573e4            25018 main/debug/binary-arm64/Packages
+ 170d70b521b415448b114d8b1d4a9d04abdb852a5a05e3ea56e505c1c81997e6             5769 main/debug/binary-arm64/Packages.gz
+ b1604294ff3204a716d0ca38ffae8d858383f6d458f8d537a485836a98b72d6d             5220 main/debug/binary-arm64/Packages.xz
+ ac78b7c2222c54b356e49b9876cffde2d574055376b6a357bb8c09b616a51ceb            25018 main/debug/binary-armhf/Packages
+ 4108ca6d29b26372f7408bd80307eb51dd868d414bd8cdb81a49d8c3534b9434             5747 main/debug/binary-armhf/Packages.gz
+ eeb527823a3421bcc9e4a4e81ac19c516ed97eb2b8a589be2d94652fd6159c90             5220 main/debug/binary-armhf/Packages.xz
+ d70b2b304e1ad8fbdcc9862e3168fbaa66c67ac84efc1285b9e0a2446417bc57             2310 main/debug/binary-i386/Packages
+ e89277865c7203cf3135783401c5edb04f1168c7ed91bd904bc693b397f862bf              898 main/debug/binary-i386/Packages.gz
+ 7fe9a00b9a5a7039d0a58bbb4a4ce77796d6b51125121c3100b69ec1eb2b73c8              936 main/debug/binary-i386/Packages.xz
+ be4145d43170960e2a63fe37ce49056ea767d877f7c99266b09a95c539d0520c            25138 main/debug/binary-ppc64el/Packages
+ f24c97af7e759d451b22697cbc37830aae632df31f85513a0652159b3d2973e7             5763 main/debug/binary-ppc64el/Packages.gz
+ e221f45db4abbb95efa4b52501545e1829bc50664c887069ee6915419a8e81dd             5204 main/debug/binary-ppc64el/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debug/binary-riscv64/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debug/binary-riscv64/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debug/binary-riscv64/Packages.xz
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855                0 main/debug/binary-s390x/Packages
+ 9ceffb7310338057cfe71a4ae1e2c98d2c485d81cdef906532a801f457a38d64               20 main/debug/binary-s390x/Packages.gz
+ 0040f94d11d0039505328a90b2ff48968db873e9e7967307631bf40ef5679275               32 main/debug/binary-s390x/Packages.xz
+ 54a93f60720cf899f7a11e4029f08cbc9579ae0b67d7bb2858c819f290a20506              201 main/i18n/Index
+ 94da79e29963e1fb6ef793e21c987d2e0a29d4bd26929c9459ce2e30002a437c            22237 main/i18n/Translation-en
+ e2fef447d114c13919243a38b108375f16bd24f91676e95878d67e7f32637cf9             6367 main/i18n/Translation-en.gz
+ 7fb69dc91fc9edbb8bbf5f1086f49f325c6a75e5431cdcf9cdd09aacff48d5a3             6104 main/i18n/Translation-en.xz
+ d7758bdad693afe4d0644eef0ca7bd357204e2d464422e769e4dd1ec804dff92              135 main/source/Release
+ aa1da047cfd128322cc35434ceeb1ff7c1061eacb510292470f8a88c99a7d958             6376 main/source/Sources
+ abc69bee0a5e5a731f835d6cfb1157ff4cace91082e00da4a8ea1e4cfe2a8889             1988 main/source/Sources.gz
+ a1cc34c569d0d64c1d3147872fed6d9496f85299bcc3c1b72a9414c7c1b9db9f             1980 main/source/Sources.xz
+Acquire-By-Hash: yes
diff --git a/spec/lib/rmt/cli/export_spec.rb b/spec/lib/rmt/cli/export_spec.rb
index 41c6cf481..140c1423d 100644
--- a/spec/lib/rmt/cli/export_spec.rb
+++ b/spec/lib/rmt/cli/export_spec.rb
@@ -95,7 +95,7 @@
         allow_any_instance_of(RMT::Mirror).to receive(:mirror_now)
 
         expect(suma_product_tree_double).to receive(:mirror).and_raise(RMT::Mirror::Exception, 'black mirror')
-        expect_any_instance_of(RMT::Logger).to receive(:warn).with('black mirror')
+        expect_any_instance_of(RMT::Logger).to receive(:warn).with(/black mirror/)
         command
       end
     end
diff --git a/spec/lib/rmt/file_validator_spec.rb b/spec/lib/rmt/file_validator_spec.rb
index f50f9c54a..488259a0e 100644
--- a/spec/lib/rmt/file_validator_spec.rb
+++ b/spec/lib/rmt/file_validator_spec.rb
@@ -238,30 +238,6 @@ def initialize(deep_verify)
     end
   end
 
-  RSpec::Matchers.define :contain_records_like do |expected|
-    match do |actual|
-      record_struct = Struct.new(:local_path, :checksum, :checksum_type, :size)
-
-      @actual = actual.map { |r| record_struct.new(r.local_path, r.checksum, r.checksum_type, r.size) }
-      @expected = expected.map { |r| record_struct.new(r.local_path, r.checksum, r.checksum_type, r.size) }
-
-      actual.all? do |record|
-        expected.any? do |object|
-          record.local_path == object.local_path &&
-            record.checksum == object.checksum &&
-            record.checksum_type == object.checksum_type &&
-            record.size == object.size
-        end
-      end
-    end
-
-    failure_message do |actual|
-      "expected that collection #{actual} would contain #{expected}"
-    end
-
-    diffable
-  end
-
   describe '#find_valid_files_by_checksum' do
     let(:valid_file) do
       fixture_path = file_fixture('dummy_product/product/apples-0.1-0.x86_64.rpm').to_s
diff --git a/spec/lib/rmt/mirror/base_spec.rb b/spec/lib/rmt/mirror/base_spec.rb
index 767595cfe..8c83f5e5a 100644
--- a/spec/lib/rmt/mirror/base_spec.rb
+++ b/spec/lib/rmt/mirror/base_spec.rb
@@ -1,9 +1,9 @@
 require 'rails_helper'
 
 describe RMT::Mirror::Base do
-  subject(:base) { described_class.new(**configuration) }
+  subject(:base) { described_class.new(**mirror_configuration) }
 
-  let(:configuration) do
+  let(:mirror_configuration) do
     {
       repository: repository,
       logger: logger,
@@ -86,6 +86,21 @@
     end
   end
 
+  describe '#create_repository_path' do
+    it 'creates the repository path' do
+      allow(Dir).to receive(:exist?).and_return(false)
+      expect(FileUtils).to receive(:mkpath).with('/rspec/repository/update/hype/15.3/product/')
+      base.create_repository_path
+    end
+
+    it 'fails when it could not create the repository path' do
+      allow(Dir).to receive(:exist?).and_return(false)
+      allow(FileUtils).to receive(:mkpath).and_raise(StandardError)
+
+      expect { base.create_repository_path }.to raise_error(RMT::Mirror::Exception, /Could not create local directory/)
+    end
+  end
+
   describe '#cleanup_temp_dirs' do
     let(:temp_metadata) { '/tmp/metadata' }
     let(:temp_licenses) { '/tmp/licenses' }
@@ -124,15 +139,15 @@
   end
 
   describe '#check_signature' do
-    let(:config) do
+    let(:ref_configuration) do
       {
         base_dir: '/tmp',
         base_url: 'https://updates.suse.de/'
       }
     end
-    let(:signature_file) { RMT::Mirror::FileReference.new(relative_path: 'repo.gpg', **config) }
-    let(:key_file) { RMT::Mirror::FileReference.new(relative_path: 'repo.key', **config) }
-    let(:metadata) { RMT::Mirror::FileReference.new(relative_path: 'metadata', **config) }
+    let(:signature_file) { RMT::Mirror::FileReference.new(relative_path: 'repo.gpg', **ref_configuration) }
+    let(:key_file) { RMT::Mirror::FileReference.new(relative_path: 'repo.key', **ref_configuration) }
+    let(:metadata) { RMT::Mirror::FileReference.new(relative_path: 'metadata', **ref_configuration) }
     let(:gpg_checker) do
       RMT::GPG.new(
         metadata_file: metadata.local_path,
@@ -177,6 +192,7 @@
 
     it 'downloads enqueued contents and clear queue' do
       expect(downloader).to receive(:download_multi)
+      expect(base.enqueued.count).to eq(1)
       base.download_enqueued
       expect(base.enqueued).to be_empty
     end
@@ -236,7 +252,7 @@
 
     it 'copies content from source to destination without backup' do
       expect(base).to receive(:replace_directory).with(source: src, destination: dest, with_backup: false).and_yield
-      expect(FileUtils).to receive(:mv).with(Dir.glob(src), dest)
+      expect(FileUtils).to receive(:mv).with(Dir.glob(src), dest, force: true)
       base.copy_directory_content(source: src, destination: dest)
     end
   end
diff --git a/spec/lib/rmt/mirror/debian_spec.rb b/spec/lib/rmt/mirror/debian_spec.rb
index 44cda251a..0796c5ee5 100644
--- a/spec/lib/rmt/mirror/debian_spec.rb
+++ b/spec/lib/rmt/mirror/debian_spec.rb
@@ -1,7 +1,7 @@
 require 'rails_helper'
 
 describe RMT::Mirror::Debian do
-  subject(:debian) { described_class.new(**configuration) }
+  subject(:debian) { described_class.new(**debian_mirror_configuration) }
 
   let(:repository) do
     create :repository,
@@ -11,7 +11,7 @@
 
   # Configuration for Debian mirroring instance
   let(:mirroring_base_dir) { '/test/repository/base/path/' }
-  let(:configuration) do
+  let(:debian_mirror_configuration) do
     {
       repository: repository,
       logger: RMT::Logger.new('/dev/null'),
@@ -83,14 +83,15 @@
   end
 
   describe '#mirror_metadata' do
-    let(:config) do
+    let(:release_fixture) { 'Release' }
+    let(:release_configuration) do
       {
-        relative_path: 'Release',
+        relative_path: release_fixture,
         base_dir: file_fixture('debian/'),
         base_url: 'https://updates.suse.de/Debian/'
       }
     end
-    let(:release_ref) { RMT::Mirror::FileReference.new(**config) }
+    let(:release_ref) { RMT::Mirror::FileReference.new(**release_configuration) }
 
     before do
       allow(debian).to receive(:temp).with(:metadata).and_return('bar')
@@ -100,7 +101,7 @@
     it 'succeeds' do
       allow(debian).to receive(:check_signature)
       allow(debian).to receive(:parse_release_file).and_return([])
-      expect(debian).to receive(:download_enqueued)
+      expect(debian).to receive(:download_enqueued).twice
       debian.mirror_metadata
     end
 
@@ -110,7 +111,36 @@
       it 'downloads and parses the file' do
         expect(debian).to receive(:download_cached!).with(release_path, to: 'bar')
         expect(debian).to receive(:check_signature)
+        expect(debian).to receive(:download_enqueued).twice
+        debian.mirror_metadata
+      end
+    end
+
+    context 'nested debian repository' do
+      let(:release_fixture) { 'nested/Release' }
+
+      before do
+        allow(debian).to receive(:download_cached!).and_return(release_ref)
+        allow(debian).to receive(:check_signature)
+        described_class.send(:public, :enqueued)
+      end
+
+      it 'ignores non-existent references from release file' do
+        allow(debian).to receive(:download_enqueued)
+        allow(debian).to receive(:enqueue)
+
+        expect(debian).to receive(:download_enqueued).with(continue_on_error: true)
+        expect(debian).to receive(:enqueue).with(all(be_like_relative_path(/(Packages|Sources|Translation)(-\w+)?$/)))
+
+        debian.mirror_metadata
+      end
+
+      it 'calls download_enqueued for the remaining valid paths' do
+        expect(debian).to receive(:download_enqueued).with(continue_on_error: true)
         expect(debian).to receive(:download_enqueued)
+        expect(debian).to receive(:enqueue).with(all(be_like_relative_path(/(Packages|Sources|Translation)(-\w+)?$/))).once
+        expect(debian).to receive(:enqueue).once
+
         debian.mirror_metadata
       end
     end
@@ -161,17 +191,38 @@
         expect { debian.parse_package_list(packages_ref) }.to raise_error(RMT::Mirror::Exception, /unexpected end of file/)
       end
     end
+
+    context 'nested repository structure' do
+      let(:fixture) { 'nested/Packages.gz' }
+      let(:repository) do
+        create :repository,
+          name: 'HYPE product repository debian 15.3',
+          external_url: 'https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu/dists/focal/'
+      end
+
+      it 'removes dists/ from mirroring path and external URL' do
+        packages = debian.parse_package_list(packages_ref)
+
+        expect(packages).to all(
+          have_attributes(
+            base_url: 'https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu/',
+            base_dir: mirroring_base_dir + 'ondrej/nginx/ubuntu/',
+            cache_dir: mirroring_base_dir + 'ondrej/nginx/ubuntu/'
+          )
+        )
+      end
+    end
   end
 
   describe '#parse_release_file' do
-    let(:config) do
+    let(:release_configuration) do
       {
         relative_path: rel_path,
         base_dir: file_fixture('debian/'),
         base_url: 'https://updates.suse.de/Debian/'
       }
     end
-    let(:release_ref) { RMT::Mirror::FileReference.new(**config) }
+    let(:release_ref) { RMT::Mirror::FileReference.new(**release_configuration) }
 
     context 'Release file is valid' do
       let(:rel_path) { 'Release' }
diff --git a/spec/lib/rmt/mirror/license_spec.rb b/spec/lib/rmt/mirror/license_spec.rb
index f4bea4446..1cec189dc 100644
--- a/spec/lib/rmt/mirror/license_spec.rb
+++ b/spec/lib/rmt/mirror/license_spec.rb
@@ -14,20 +14,22 @@
   let(:license_configuration) do
     {
       repository: repository,
-      logger: RMT::Logger.new('/dev/null'),
+      logger: logger,
       mirroring_base_dir: base_dir
     }
   end
 
+  let(:logger) { RMT::Logger.new('/dev/null') }
+
   let(:fixture) { 'directory.yast' }
-  let(:config) do
+  let(:license_listing_configuration) do
     {
       relative_path: fixture,
       base_dir: file_fixture(''),
       base_url: 'https://updates.suse.de/sles/'
     }
   end
-  let(:licenses_ref) { RMT::Mirror::FileReference.new(**config) }
+  let(:licenses_ref) { RMT::Mirror::FileReference.new(**license_listing_configuration) }
 
   before do
     allow(FileUtils).to receive(:mkpath).with(license.repository_path).and_return(nil)
@@ -42,6 +44,7 @@
 
     it 'returns false if directory.yast is not available' do
       stub_request(:head, license.repository_url('directory.yast')).to_return(status: 404, body: '', headers: {})
+      expect(logger).to receive(:debug)
       expect(license.licenses_available?).to eq(false)
     end
 
diff --git a/spec/lib/rmt/mirror/repomd_spec.rb b/spec/lib/rmt/mirror/repomd_spec.rb
index 63a514779..16954b535 100644
--- a/spec/lib/rmt/mirror/repomd_spec.rb
+++ b/spec/lib/rmt/mirror/repomd_spec.rb
@@ -1,17 +1,7 @@
 require 'rails_helper'
 
 RSpec.describe RMT::Mirror::Repomd do
-  subject(:repomd) { described_class.new(**repomd_configuration) }
-
-  RSpec::Matchers.define :file_reference_containing_path do |expected|
-    match do |actual|
-      actual.local_path.include?(expected)
-    end
-
-    failure_message do |actual|
-      "expected that file path #{actual.local_path} would contain #{expected}"
-    end
-  end
+  subject(:repomd) { described_class.new(**repomd_mirror_configuration) }
 
   let(:logger) { RMT::Logger.new('/dev/null') }
 
@@ -25,7 +15,7 @@
 
   # Configuration for Debian mirroring instance
   let(:base_dir) { '/test/repository/base/path/' }
-  let(:repomd_configuration) do
+  let(:repomd_mirror_configuration) do
     {
       repository: repository,
       logger: logger,
@@ -35,14 +25,14 @@
 
   # Configuration for file reference to an arbitrary fixture
   let(:fixture) { 'repodata/repomd.xml' }
-  let(:config) do
+  let(:file_ref_configuration) do
     {
       relative_path: fixture,
       base_dir: file_fixture('dummy_repo/'),
       base_url: 'https://updates.suse.com/sample/repository/15.4/'
     }
   end
-  let(:repomd_ref) { RMT::Mirror::FileReference.new(**config) }
+  let(:repomd_ref) { RMT::Mirror::FileReference.new(**file_ref_configuration) }
 
   before do
     described_class.send(:public, *described_class.protected_instance_methods)
@@ -85,15 +75,15 @@
   end
 
   describe '#mirror_metadata' do
-    let(:x_config) do
+    let(:ref_configuration) do
       {
         base_dir: base_dir,
         base_url: 'https://updates.suse.com/sample/repository/15.4/',
         cache_dir: repomd.repository_path
       }
     end
-    let(:signature_file) { RMT::Mirror::FileReference.new(relative_path: 'repodata/repomd.xml.asc', **x_config) }
-    let(:key_file) { RMT::Mirror::FileReference.new(relative_path: 'repodata/repomd.xml.key', **x_config) }
+    let(:signature_file) { RMT::Mirror::FileReference.new(relative_path: 'repodata/repomd.xml.asc', **ref_configuration) }
+    let(:key_file) { RMT::Mirror::FileReference.new(relative_path: 'repodata/repomd.xml.key', **ref_configuration) }
     let(:repomd_parser) { RepomdParser::RepomdXmlParser.new(repomd_ref.local_path) }
 
     before do
@@ -144,7 +134,7 @@
     let(:fixture) { 'repodata/repomd.xml' }
     let(:fixture_base_dir) { file_fixture('dummy_repo') }
     let(:repomd_package_ref) do
-      RMT::Mirror::FileReference.new(**config).tap do |ref|
+      RMT::Mirror::FileReference.new(**file_ref_configuration).tap do |ref|
         ref.type = type
       end
     end
@@ -181,7 +171,7 @@
 
   describe '#mirror_packages' do
     let(:fixture) { 'repodata/abf421e45af5cd686f050bab3d2a98e0a60d1b5ca3b07c86cb948fc1abfa675e-primary.xml.gz' }
-    let(:primary_ref) { RMT::Mirror::FileReference.new(**config).tap { |ref| ref.type = :primary } }
+    let(:primary_ref) { RMT::Mirror::FileReference.new(**file_ref_configuration).tap { |ref| ref.type = :primary } }
     let(:package_ref) { instance_double(RMT::Mirror::FileReference) }
 
     it 'downloads the reference packages' do
diff --git a/spec/lib/rmt/mirror/suma_product_tree_spec.rb b/spec/lib/rmt/mirror/suma_product_tree_spec.rb
index 96627603c..e010c441d 100644
--- a/spec/lib/rmt/mirror/suma_product_tree_spec.rb
+++ b/spec/lib/rmt/mirror/suma_product_tree_spec.rb
@@ -1,9 +1,9 @@
 require 'rails_helper'
 
 RSpec.describe RMT::Mirror::SumaProductTree do
-  subject(:suma) { described_class.new(**configuration) }
+  subject(:suma) { described_class.new(**suma_mirror_configuration) }
 
-  let(:configuration) do
+  let(:suma_mirror_configuration) do
     {
       logger: RMT::Logger.new('/dev/null'),
       mirroring_base_dir: base_dir
@@ -23,7 +23,7 @@
 
   describe '#mirror' do
     before do
-      allow(suma).to receive(:downloader).and_return downloader
+      allow(RMT::Downloader).to receive(:new).and_return downloader
     end
 
     it 'mirrors the product_tree file' do
diff --git a/spec/lib/rmt/mirror_spec.rb b/spec/lib/rmt/mirror_spec.rb
index 2f23e4479..5829ec02d 100644
--- a/spec/lib/rmt/mirror_spec.rb
+++ b/spec/lib/rmt/mirror_spec.rb
@@ -27,26 +27,28 @@
 
       it 'uses the credentials from the repository if the repository has credentials' do
         stub_request(:head, authenticated_repo_url)
-          .to_return(status: 200, body: '', headers: {})
+        .to_return(status: 200, body: '', headers: {})
 
         allow(repository).to receive(:auth_token).and_return('token')
         expect(RMT::HttpRequest).to receive(:new)
-          .with(authenticated_repo_url, method: :head, followlocation: true)
-          .and_call_original
+        .with(authenticated_repo_url, method: :head, followlocation: true)
+        .and_call_original
 
         mirror.repository_type
       end
 
       it 'uses no credentials from the repository if the repository has no credentials' do
         stub_request(:head, repomd_url)
-          .to_return(status: 200, body: '', headers: {})
+        .to_return(status: 200, body: '', headers: {})
 
         expect(RMT::HttpRequest).to receive(:new)
-          .with(URI.parse(repomd_url), method: :head, followlocation: true)
-          .and_call_original
+        .with(URI.parse(repomd_url), method: :head, followlocation: true)
+        .and_call_original
 
         mirror.repository_type
       end
+
+      # it 'continues checking repo if fi'
     end
 
     context 'repomd repository' do
@@ -68,8 +70,8 @@
       end
     end
 
-    context 'debian flat repository' do
-      it 'detects a flat debian repository' do
+    context 'debian repository' do
+      it 'detects a debian repository' do
         stub_request(:head, repomd_url).to_return(status: 404, body: '', headers: {})
         stub_request(:head, debian_url).to_return(status: 200, body: '', headers: {})
 
@@ -77,6 +79,19 @@
       end
     end
 
+    context 'local file as URI' do
+      let(:url) { 'file:///test/export/SUSE/Products/SLE-Product-SLES/15-SP4/x86_64/product/' }
+      let(:path_repomd) { File.join(URI.join(url).path, 'repodata/repomd.xml') }
+      let(:path_debian) { File.join(URI.join(url).path, 'Release') }
+
+      it 'continues checking for repository type' do
+        allow(File).to receive(:exist?).with(path_repomd).and_return(false)
+        allow(File).to receive(:exist?).with(path_debian).and_return(true)
+
+        expect(mirror.repository_type).to eq(:debian)
+      end
+    end
+
     context 'unknown repository type' do
       it 'raises if a unknown repository type is detected' do
         stub_request(:head, repomd_url).to_return(status: 404, body: '', headers: {})
@@ -86,4 +101,39 @@
       end
     end
   end
+
+  describe '#mirror_now' do
+    context 'repomd repository' do
+      let(:repomd_mirror) { instance_double('RMT::Mirror::Repomd') }
+
+      before do
+        allow(mirror).to receive(:repository_type).and_return(:repomd)
+        allow(RMT::Mirror::Repomd).to receive(:new).and_return(repomd_mirror)
+      end
+
+      it 'creates a repomd mirror instance and calls mirror' do
+        expect(repomd_mirror).to receive(:mirror)
+        mirror.mirror_now
+      end
+    end
+
+    context 'debian repository' do
+      let(:debian_mirror) { instance_double('RMT::Mirror::Debian') }
+
+      before do
+        allow(mirror).to receive(:repository_type).and_return(:debian)
+        allow(RMT::Mirror::Debian).to receive(:new).and_return(debian_mirror)
+      end
+
+      it 'creates a debian mirror instance and calls mirror' do
+        expect(debian_mirror).to receive(:mirror)
+        mirror.mirror_now
+      end
+    end
+
+    it 'raises an exception if the repository type is unknown' do
+      allow(mirror).to receive(:repository_type).and_return(nil)
+      expect { mirror.mirror_now }.to raise_error(RMT::Mirror::Exception)
+    end
+  end
 end
diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb
new file mode 100644
index 000000000..999d07d9b
--- /dev/null
+++ b/spec/support/matchers.rb
@@ -0,0 +1,45 @@
+RSpec::Matchers.define :file_reference_containing_path do |expected|
+  match do |actual|
+    actual.local_path.include?(expected)
+  end
+
+  failure_message do |actual|
+    "expected that file path #{actual.local_path} would contain #{expected}"
+  end
+end
+
+RSpec::Matchers.define :be_like_relative_path do |regex|
+  match do |actual|
+    actual.relative_path =~ regex
+  end
+
+  failure_message do |actual|
+    "expected that file path #{actual.relative_path} would contain #{regex}"
+  end
+end
+
+# rubocop:disable Lint/StructNewOverride
+RSpec::Matchers.define :contain_records_like do |expected|
+  match do |actual|
+    record_struct = Struct.new(:local_path, :checksum, :checksum_type, :size)
+
+    @actual = actual.map { |r| record_struct.new(r.local_path, r.checksum, r.checksum_type, r.size) }
+    @expected = expected.map { |r| record_struct.new(r.local_path, r.checksum, r.checksum_type, r.size) }
+
+    actual.all? do |record|
+      expected.any? do |object|
+        record.local_path == object.local_path &&
+          record.checksum == object.checksum &&
+          record.checksum_type == object.checksum_type &&
+          record.size == object.size
+      end
+    end
+  end
+
+  failure_message do |actual|
+    "expected that collection #{actual} would contain #{expected}"
+  end
+
+  diffable
+end
+# rubocop:enable Lint/StructNewOverride