Match ends, Portsmouth 1, Exeter City 2.
Exeter won at Portsmouth for the first time in 92 years to end the hosts' unbeaten League Two start and knock them off top spot in the table.
Pompey's Gareth Evans was twice denied early on, but Exeter went in front through David Wheeler's angled drive.
Aaron Davies' well-placed header put City in control as keeper Aaron McCarey failed to hold a left-wing cross.
Gary Roberts' deflected strike pulled one back in stoppage time, but it was too little, too late for the home side.
Portsmouth had plenty of second-half possession but repeatedly failed to capitalise as Danny Butterfield cleared off the line from Kyle Bennett, and Matt Tubbs headed over from close in.
The Grecians' reward for a second away win of the season was to climb up to ninth in the table, while Pompey drop to third place after wins for Wycombe and Plymouth.
- 6BurgessBooked at 54mins
- 29HollandsSubstituted forDoyleat 81'minutes
- 26EvansSubstituted forRobertsat 66'minutes
- 19ChaplinSubstituted forTubbsat 55'minutes
- 23BennettBooked at 65mins
- 4NobleSubstituted forButterfieldat 45'minutes
- 19OyelekeSubstituted forHoskinsat 79'minutes
- 31GrantSubstituted forMcCreadyat 73'minutes
- Nick Kinseley
- Shots on Target
Second Half ends, Portsmouth 1, Exeter City 2.
Goal! Portsmouth 1, Exeter City 2. Gary Roberts (Portsmouth) left footed shot from outside the box to the centre of the goal. Assisted by Christian Burgess.
Kyle Bennett (Portsmouth) wins a free kick in the attacking half.
Foul by Arron Davies (Exeter City).
Attempt missed. Matt Tubbs (Portsmouth) header from very close range is too high.
Attempt missed. Enda Stevens (Portsmouth) left footed shot from the left side of the box is close, but misses to the right.
Corner, Portsmouth. Conceded by Christian Ribeiro.
Substitution, Portsmouth. Michael Doyle replaces Danny Hollands.
Substitution, Exeter City. Will Hoskins replaces Manny Oyeleke.
Corner, Portsmouth. Conceded by Arron Davies.
Substitution, Exeter City. Tom McCready replaces Joel Grant.
Foul by Adam Barton (Portsmouth).
Danny Butterfield (Exeter City) wins a free kick in the attacking half.
Attempt missed. Kyle Bennett (Portsmouth) right footed shot from outside the box is just a bit too high.
Substitution, Portsmouth. Gary Roberts replaces Gareth Evans.
Foul by Jayden Stockley (Portsmouth).
Jordan Tillson (Exeter City) wins a free kick in the defensive half.
Kyle Bennett (Portsmouth) is shown the yellow card for a bad foul.
Foul by Kyle Bennett (Portsmouth).