France will play in the World Cup final for the first time since 2006 after beating Belgium 1-0 thanks to a goal from Samuel Umtiti in St Petersburg on Tuesday evening.
Both sides had plenty of chances, with France taking 19 shots to Belgium's nine, but only Umtiti's 51st-minute header following Antoine Griezmann's corner found the back of the net.
Kylian Mbappe surged forward inside the first 10 seconds and crossed low for Griezmann, but the forward failed to get on the end of it and Belgium cleared.
Belgium threatened down the flanks and Eden Hazard put in a dangerous cross which was turned behind by Umtiti -- though the resulting corner was wasted by Nacer Chadli, playing in an unfamiliar right-back role.
After a cagey opening, Paul Pogba's ball over the top almost created an opportunity in the box for Mbappe before the same combination a few minutes later saw Belgium goalkeeper Thibaut Courtois forced to race out and smother a throughball before Mbappe could get on the end of it.
France were careless in possession and Belgium almost went ahead as Kevin De Bruyne chipped a pass to Hazard who blasted a low shot just past the post.
An even match then saw Blaise Matuidi fire in a shot on 18 minutes but Courtois was grateful that it was straight at him. Then, moments later, at the other end, Hazard's goalbound shot was flicked over the bar by the retreating Raphael Varane.
Belgium were pushing for a goal and France had to rely on a brilliant stop from Hugo Lloris after his Tottenham teammate Toby Alderweireld somehow got a shot off after a corner that was travelling into the top corner.
Umtiti was the next France player to save a certain goal as De Bruyne's cross squeezed through and the defender hacked clear from inside his own six-yard box with Belgium players lining up to slot it into the net.
France still threatened at the other end though. On 30 minutes, Olivier Giroud tried a header that flew wide of the post before Griezmann opened up some space and blasted the ball well over the bar.
Giroud then had another great chance as Mbappe cushioned a long ball across the area, only for the striker to fluff his shot under pressure from Alderweireld.
After Belgium's early pressure, it was France pushing harder as half-time approached. Benjamin Pavard was slipped through by a fine Mbappe ball, but Courtois stuck out a leg and deflected his shot wide.
There was still time for Umtiti to miskick and almost let in Romelu Lukaku, but somehow the teams went into the break tied at 0-0.
Lukaku had the first chance of the second half as Axel Witsel put in a fine cross, but the Manchester United striker could not direct his header on target.
And Belgium were made to pay on 51 minutes as Umtiti leaped ahead of Marouane Fellaini at a corner to head home from Griezmann's delivery.
Mbappe's incredible backheel then put Giroud clear on goal but the striker's effort was well blocked by Mousa Dembele. It was one of Dembele's last acts as Dries Mertens came on for the midfielder as Belgium chased an equaliser. Mertens almost had an immediate impact as his cross was headed skywards by Varane and De Bruyne missed his kick when coming in to hit a volley.
Fellaini's header whistled past the post before Giroud skied another effort.
France sat back and looked to use the pace Mbappe on the counter attack but were almost caught out as Hazard forced a wonderful tackle from Varane and Lloris had to beat away a vicious shot on the followup from Witsel.
Matuidi suffered a head injury after a collision with Hazard and had to be withdrawn, before De Bruyne's stunning pass floated just too long for Lukaku to put a finishing touch to.
Six minutes of injury time provided Belgium with hope but France ran the clock down and almost made it 2-0 as Griezmann and then Corentin Tolisso's shots were well saved by Courtois. In the end, Umtiti's goal was enough to secure a place in the Moscow final and a meeting with either England or Croatia on Sunday.