The Bulls beat the Sharks 39-33 in a bruising encounter at Loftus Versfeld, Pretoria.
It is the Bulls sixth win in seven Super Rugby matches against the Sharks and they again do the double over the men from Durban.
The Blue Bulls raced into a 19-7 lead before the half-hour with tries from Warrick Gelant, Jesse Kriel and Roelof Smit.
The Sharks hit back through Curwin Bosch, minutes after the fullback returned to the field following a yellow card for tripping.
Jacques Vermeulen reduced the deficit to 19-14.
Handre Pollard and Bosch traded long-range penalties before the break as the home side took a slender five-point lead into the shed.
Robert du Preez kicked two early second-half penalties to put his side in front, but the home team charged back.
Tries by Johnny Kotze and Lood de Jager extended John Mitchell’s team’s lead to 36-23.
Pollard added another three after Lukhanyo Am’s yellow card, but the visitors struck again when Jean-Luc du Preez crossed.
It was not enough and with time up on the clock, Rob du Preez kicked a last-ditch penalty to secure his team an important losing bonus-point.
Sharks got off to a terrible start.
Bosch thought he scored, finishing off a wonderful mood, but it was chalked off when the referee went back to check with the TMO for foul play.
The video replay showed the fullback had tried to trip a Bulls attacker and he was promptly sent to the sideline.
The turnaround saw the home team take their first chance.
Gelant latched onto Kriel’s grubber-kick. The ball bounced away from Sibusiso Nkosi and the fullback was in for the game’s opening try.
Four minutes’ later, Kriel doubled his side’s lead when he ghosted through two forwards in the midfield and ran away to score under the sticks.
Akker van der Merwe broke two tackles before playing Beast Mtawarira. The prop powered forward and offloaded to Bosch, who had just returned to the field, for the try.
The Bulls marched straight back down the field and increased their hold on the game.
Travis Ismaiel’s acrobatics kept the play alive while being tackled into touch.
Smit picked up the loose ball and walked over the try-line.
The away team were on the ropes, but they were given a life-line when Rudolph Snyman was yellow carded.
The Sharks went to a short lineout and Vermeulen was in for the score after a great forward move by the Durbanites.
Thomas du Toit was caught offsides, and Pollard made it 22-14.
Bosch kicked his monster penalty to cancel out the previous one by the Springbok flyhalf.
The Sharks dominated the early exchanges in the second-half.
The visitors came out strong after the interval. Their forwards managed to dominate the gain-line and they got a foothold in the set-pieces.
Du Preez added two more penalties which put his team in front.
But it was that man Gelant, who took centre stage again.
The fullback looked like he had knocked on before Kotze’s try, but the replay showed that he had the presence of mind to toe the ball instead of catching it.
The Sharks seemed to stop playing while Gelant picked up the bouncing ball and offloaded to Kotze.
Both sides were still playing for territory, but they started to make errors, gifting possession back to the opposition.
Coach Robert du Preez’s men were fighting to stay in the game, but when De Jager carried several players over the whitewash, the game was over.
To their credit, the visitors never stopped playing.
Am was sent to the touchline and Pollard ended the game with his second penalty which stretched the lead to 39-23.
Jean-Luc du Preez crossed and his brother’s penalty after the hooter gave their team a losing bonus-point.
Final score: Bulls 39 (22) Sharks 33 (17)
Tries – Gelant, Kriel, Smith, Kotze, De Jager
Pen – Pollard (2)
Con – Pollard (4)
Cards – Snyman (Yellow, 34′)
Tries – Bosch, Vermeulen, J. du Preez
Pen – Bosch, R. du Preez (3)
Con – R. du Preez (3)
Cards – Bosch (Yellow, 10′), Am (Yellow, 69′)
Referee: Rasta Rasivhenge
Assistant Ref 1: AJ Jacobs
Assistant Ref 2: Archie Selanko
TMO: Marius Jonker
15 Warrick Gelant, 14 Travis Ismaiel, 13 Jesse Kriel, 12 Burger Odendaal (captain), 11 John-Ben Kotze, 10 Handre Pollard, 9 Ivan van Zyl, 8 Marco van Staden, 7 Jason Jenkins, 6 Roelof Smit, 5 Lodewyk de Jager, 4 Rudolph Snyman, 3 Trevor Nyakane, 2 Adriaan Strauss, 1 Lizo Gqoboka.
Replacements: 16 Jaco Visagie, 17 Frans van Wyk, 18 Conraad van Vuuren, 19 Thembelani Bholi, 20 Nicholas de Jager, 21 Andre Warner, 22 Manie Libbok, 23 Divan Rossouw.
15 Curwin Bosch, 14 Sibusiso Nkosi, 13 Lukhanyo Am, 12 Andre Esterhuizen, 11 Makazole Mapimpi, 10 Robert du Preez, 9 Cameron Wright, 8 Daniel du Preez, 7 Jean-Luc du Preez, 6 Jacques Vermeulen, 5 Ruan Botha (captain), 4 Tyler Paul, 3 Thomas du Toit, 2 Armand van der Merwe, 1 Tendai Mtawarira.
Replacements: 16 Mahlatse Ralepelle, 17 Juan Schoeman, 18 Ross Geldenhuys, 19 Stephan Lewies, 20 Wian Vosloo, 21 Louis Schreuder, 22 Marius Louw, 23 Lwazi Mvovo.