Netherlands 3-1 Northern Ireland
The Oranje left it late to complete a dramatic comeback and join Germany and Northern Ireland (who have played a game more) on 12 points.
Northern Ireland threatened an upset when Josh Magennis headed in a 75th-minute Stuart Dallas cross but that merely proved a catalyst for the Dutch.
Memphis Depay prodded them level within five minutes then added the second of two added-time goals after Luuk de Jong had bundled the hosts in front.
Belarus 0-0 Estonia
Belarus will have a play-off place to look forward to thanks to their UEFA Nations League displays but their hopes of automatic qualification are mathematically over after being held by a resolute Estonia side.
The eliminated visitors hit the post early on through Konstantin Vassiljev while Stanislav Dragun went closest for the hosts, Sergei Lepmets denying him from close range.
Croatia 3-0 Hungary
Croatia moved three points clear at the top after an impressive performance in Split.
Luka Modrić’s opportunistic opener set them on their way and two goals from Bruno Petković decided it long before László Kleinheisler’s second-half dismissal.
Ivan Perišić’s missed penalty was the only blot on Croatia’s copybook.
Slovakia 1-1 Wales
Second-placed Slovekia maintained their three-point advantage over Wales, who have a game in hand in fourth, thanks to Juraj Kucka’s fine 53rd-minute volley.
The away side had been the more impressive to that point with Gareth Bale hitting the bar before Kieffer Moore’s first international goal gave them a deserved 25th-minute lead.
Play-off simulator: see who could be involved
Latvia 0-3 Poland
Robert Lewandowski’s fine form continued as his sixth international hat-trick secured a return to winning ways for Poland.
Two goals inside 13 minutes set the tone and the points were effectively in the bag long before his late third.
Poland top Group G and could qualify on Sunday; point-less Latvia are rooted to the bottom.
Austria 3-1 Israel
Austria came from behind to move up to second, two points ahead of North Macedonia and Slovenia, and five clear of Israel.
Eran Zahavi gave the visitors the lead with a superb tenth goal in qualifying but Valentino Lazaro levelled just before the break and Martin Hinteregger and Marcel Sabitzer earned Austria the points.
North Macedonia 2-1 Slovenia
The home side joined their opponents on 11 points thanks to two composed finishes from Eljif Elmas after half-time in Skopje.
A Josip Iličić penalty in the final seconds came too late for Slovenia, who had won their previous three qualifiers.
Belgium 9-0 San Marino
Belgium became the first team to qualify and equalled their largest margin of victory, Romelu Lukaku scoring his 50th and 51st international goals either side of a Nacer Chadli strike and a Christian Brolli own goal.
Toby Alderweireld, Youri Tielemans, Christian Benteke, Yari Verschaeren and Timothy Castagne were also on target.
Russia 4-0 Scotland
Russia could join Belgium in the finals with a point on Sunday but it took until the 57th minute for Artem Dzyuba to open the scoring, followed quickly by Magomed Ozdoev’s magnificent strike.
Dzyuba converted again moments later, and a deflated Scotland held on before a fourth from Aleksandr Golovin finally ended their hopes of automatic qualification; they will now definitely take part in the play-offs.
Kazakhstan 1-2 Cyprus
The home side looked in control at the break after Temirlan Yerlanov bundled them in front but Pieros Sotiriou’s header and Nicholas Ioannou’s first international goal gave Cyprus the win and kept them in the qualification picture.