Julian, first of all, you are right, I did mix up the series, I'll fix that. Now, Michael Vogt (mvo), Debian's APT main developer is currently reviewing the one line fix that solves this issue. I have a reproducer and was able to identify the root cause and prepare a fix. The source of the problem is the following : string msg = "\nIndex-File: true"; // FIXME: this really should use "IndexTarget::IsOptional()" but that // seems to be difficult without breaking ABI if (ShortDesc().find("Translation") != 0) As outlined in the FIXME, IndexTarget::IsOptional() should be used, and that is what started to happen with Wily. The code now reads : if(Target.IsOptional) msg += "\nFail-Ignore: true"; Here is the complete explanation as provided to MVO : "When the Queue responsible for fetching the Package file runs, it builds the Custom600 header with the following method : > // AcqIndex::Custom600Headers - Insert custom request headers /*{{{*/ > // --------------------------------------------------------------------- > /* The only header we use is the last-modified header. */ > string pkgAcqIndex::Custom600Headers() > { > string Final = _config->FindDir("Dir::State::lists"); > Final += URItoFileName(RealURI); > if (_config->FindB("Acquire::GzipIndexes",false)) > Final += ".gz"; > > string msg = "\nIndex-File: true"; > // FIXME: this really should use "IndexTarget::IsOptional()" but that > // seems to be difficult without breaking ABI > if (ShortDesc().find("Translation") != 0) > msg += "\nFail-Ignore: true"; > struct stat Buf; > if (stat(Final.c_str(),&Buf) == 0) > msg += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime); > > return msg; The custom header is set with "Fail-Ignore: true" in the case of a Translation file. This was true until Wily when the code got refactored to use "IndexTarget::IsOptional" as mentionned in the FIXME. As far as I can tell, the issue here is that this is wrong : if (ShortDesc().find("Translation") != 0) when string::find() does not find the string, it returns string::npos so this test is always true. This means that when Packages is downloaded, Fail-Ignore: is also set to true, which means that TryNextMirror() will not retry. In MirrorMethod::Failed() : > if (!Queue->FailIgnore && TryNextMirror()) > return; Changing the test in pkgAcqIndex::Custom600Headers() to be : if (ShortDesc().find("Translation") != string::npos) Seems to fix the issue quite nicely. From what I can tell, this is the only place where I found that test on 0. Other places do test with string::npos. " As soon as MVO is ok with this, I will SRU the modification and upload the fix. Kind regards, ...Louis