George Saville's 73rd-minute strike proved decisive as Middlesbrough ended Bristol City's unbeaten start to the Sky Bet Championship season with a 1-0 victory at Ashton Gate.
The goal resulted from a nightmare moment for defender Taylor Moore, who allowed Saville to rob him on the edge of the box as City tried to play out from the back.
Saville was left with only goalkeeper Dan Bentley to beat and did so with an assured low left-footed finish.
The result meant a first league defeat for City head coach Dean Holden and rewarded Neil Warnock's visitors for an organised and committed display.
Both defences took the honours in a first half that saw Boro create the clearer chances, while City were often let down by their final pass at the end of some promising build-ups.
The home side were quick off the blocks and Andreas Weimann should have done better when racing onto a third-minute pass from Nahki Wells only to chip tamely wide.
Boro's best opportunities fell to Chuba Akpom, the first coming on five minutes when his close-range shot was deflected wide.
Jamie Paterson shot wide from 20 yards for City before Akpom's cross-shot from the left was tipped over by Bentley.
A better chance fell to Akpom on 29 minutes, but he miskicked with the goal at his mercy from a Saville cross.
Paterson had another effort blocked for a corner, while at the other end Saville and Dael Fry moved in threateningly on a Paddy McNair free-kick only for the ball to fly well wide.
The second half began quietly, but City suffered a blow on 55 minutes when Alfie Mawson, who had excelled at the back, was carried off after stretching to make an important tackle inside the box.
Tomas Kalas returned to the side after injury as replacement. Soon afterwards Wells wasted a decent opening, shooting high over the Boro crossbar from 15 yards.
Fry received the first yellow card of what had been a cleanly fought contest on 67 minutes for a late challenge on Weimann.
Holden responded to his team's lack of goal threat by replacing both strikers on 70 minutes, Famara Diedhiou and Antoine Semenyo taking over from Chris Martin and Wells.
Boro were finding it equally hard to fashion openings until Moore's costly error. The closing stages brought them just one moment of alarm.
Tyreeq Bakinson looked to be through inside the box when challenged from behind by McNair, but referee Tim Robinson ignored City's strident penalty appeal.
Moore left the pitch with head bowed, but his team could have few complaints after failing to force a save from Marcus Bettinelli.