Based on patch by Adam J Forster, Paul Collins, and Julien. Backport of 2be621e44c1b5b68c895383f3e20b1f17ddb447a from master