Jon Guthrie’s late brace couldn’t prevent the Saddlers from falling to a first defeat in four matches at the hands of high-flying Portsmouth.
Brett Pitman’s penalty and Omar Bogle’s lob put Pompey in control at the break, with Viv Solomon-Otabor adding a third after the restart.
Guthrie pulled two back – both from corners – but the visitors held on to bring the hosts’ recent revival to an end.
Walsall entered the match looking to build on a run of seven points from the last nine, while Pompey were hoping to reignite their automatic promotion hopes after one win in 10.
And it was promotion-pushing Pompey who drew first blood with 13 minutes on the clock.
Morgan Ferrier was penalised for a blatant push on Nathan Thompson, with captain Brett Pitman sending keeper Liam Roberts the wrong way with the resulting penalty.
The hosts, who had actually started fairly brightly, spurned a big chance to level on 25 minutes – and within 60 seconds were two goals down.
Ferrier raced in behind the visitors’ defence but his low drive was straight at ex-Saddler Craig MacGillivray, who claimed at the second attempt.
The Blues keeper launched the ball forward, with his clearance somehow finding its way through to Omar Bogle, whose deft lob flew over Roberts’ head and bounced in off the bar.
Kenny Jackett’s men a goal disallowed when Jamal Lowe slotted home from Pitman’s free-kick – that was taken too quickly for referee Trevor Kettle.
The Saddlers improved at the start of the second half, without ever seriously threatening the Pompey goal.
Josh Gordon’s wonderfully inviting left-wing cross sailed over everyone and other deliveries were blocked as Portsmouth defended in numbers.
And the South Coast club moved further ahead on 68 minutes when Pitman released Jamal Lowe, who unselfishly squared for Birmingham loanee Viv Solomon-Otabor to coolly slot home.
Dean Keates’ side pulled one back seven minutes later as Jon Guthrie rose highest to head home George Dobson’s in-swinging corner.
The centre-back scored again deep in added time, hooking home from close range following a scramble from a corner, but it proved too little, too late.
Saddlers (4-3-3): L Roberts; Devlin, Scarr, Guthrie, Leahy; Dobson, Kinsella, Edwards (Blackett-Taylor 70’); Ismail (Oteh 87’), Ferrier, Gordon.
Subs not used: Dunn, Fitzwater, Norman, Osbourne, Laird.
Portsmouth (4-2-3-1): MacGillivray; Thompson, Burgess, Clarke, Brown; Naylor, Close; Lowe, Pitman (Walkes 86’), Solomon-Otabor; Bogle (Vaughan 74’).
Subs not used: Bass, Hawkins, Donohue, Evans, Haunstrup.
Attendance: 4,097 (598 Portsmouth supporters).