Goals from Tommy Conway and Rob Atkinson gave Bristol City the Severnside derby bragging rights with a 2-0 Championship win over Cardiff at Ashton Gate.
The home side took a 41st-minute lead when Nahki Wells crossed from the left and Conway got in front of his marker to net his fourth goal of the season with a glancing header.
Centre-back Atkinson made it 2-0 with a stooping header from Joe Williams' 64th-minute free-kick from the left and Nigel Pearson's team held out for a deserved three points on his 59th birthday.
Cardiff had to make a seventh-minute change when Joel Bagan suffered a head injury in a clash with Alex Scott and was replaced by Jack Simpson.
Bristol made the early running, Conway bursting clear on the left only to see his 14th-minute shot from a narrow angle smothered by Cardiff goalkeeper Ryan Allsop.
Han-Noah Massengo had the ball in the visitors' net five minutes later, but his header from an Andreas Weimann's cross was ruled out for a foul on Allsop as he jumped.
Suddenly, it was the home defence looking vulnerable as Max Watters ran onto a 38th-minute through-ball from Mahlon Romeo only to shoot over with just Dan Bentley to beat.
Seconds later Cedric Kipre shot wide at the end of a penetrating Cardiff move before the balance shifted again with Conway's goal.
It was almost 2-0 before the break as Weimann's volley from the right of Allsop's goal crashed against the underside of the bar and back into play.
Cardiff thought they had equalised in first-half injury time, but Sheyi Ojo's close-range finish from a cross by former Bristol City winger Callum O'Dowda was disallowed for offside.
The hosts had a good chance to double their lead at the start of the second half when Jay Dasilva shot wide at the far post from a Weimann cross.
Williams had a low shot deflected past a post and Atkinson fired narrowly wide as Cardiff came under heavy pressure.
Boss Steve Morison responded with a double substitution on 57 minutes, sending on Mark Harris and Jaden Philogene-Bidace for Watters and Ojo.
Cardiff's Romaine Sawyers and Bristol City's Massengo went close with shots that flew wide. Then came Atkinson's goal and a Cardiff riposte which saw Bentley save bravely at the feet of first Harris and then another substitute, Rubin Colwill.
Dasilva risked conceding a penalty when bundling into the back of Romeo, but referee Thomas Bramall saw nothing wrong.
Weimann netted from close range on 78 minutes, but was clearly offside from Wells' cross and the flag duly went up.
It made no difference as Cardiff's late efforts to get back into the game met with solid resistance.
Bristol City: Bentley, Vyner, Naismith, Atkinson, Williams (King 83’), Massengo (Wilson 87’), Scott, Dasilva, Conway (Martin 79’), Wells (Klose 90+3’).
Subs not used: O’Leary, Pring, Tanner.
Cardiff City: Allsop, Romeo (Etete 83’), Kipré, Ng, Bagan (Simpson 7’), Wintle, Rinomhota (Colwill 65’), Sawyers (Ralls 65’), Ojo (Philogene 57’), O’Dowda, Watters (Harris 57’).
Subs not used: Alnwick.