The Bulls extended their winning streak to five matches when they beat the Highlanders 35-18 at Loftus Versfeld.
The Highlanders had to play almost 20 minutes of the match with 14 players as two players were sent to the sin-bin.
After a controversial first half try was awarded to the Bulls by the TMO the home side led 23-6.
The result moved the Bulls to second place in the overall Super Rugby standings and provisionally gives them a 10 point lead over the second placed Cheetahs.
The Bulls made a promising start as they opened the scoring with a try two minutes into the match.
They set up a few phases and advanced into the Highlanders' 22 where scrumhalf Francois Hougaard skipped passed the ball to his left.
The ball bounced twice before landing into centre JJ Engelbrecht's hands to score in the corner, with flyhalf Morne Steyn converting.
The Highlanders, however, managed to keep the Bulls' attack at bay with flyhalf Colin Slade slotting two consecutive penalty conversions.
The game went into a lull in the middle of the first half with neither side finding a try opportunity.
Steyn the scoreboard ticking over, succeeding with three penalty conversions within 15 minutes to extend the Bulls' lead to 16-6.
The Highlanders were anything but passive spectators as they threatened the Bulls' line on a number of occasions.
The tourists' most promising attack came shortly before the half-time break when they probed the Bulls' defence metres from the tryline.
Bulls hooker Chiliboy Ralepelle, however, set in motion the turning point of the match with a thumping tackle on a Highlanders player which saw the ball spill loose into Bulls flanker Dewald Potgieter's hand.
Potgieter offloaded to Engelbrecht, who in turn passed to flyer Akona Ndungane, who stepped inside and showed a clean pair of heels to score his side's second try.
Ndungane's try was awarded but the TMO decision was controversial as the players, commentators and many of the fans saw the ball travel forward in the replays.
Steyn brought the half to a close with the conversion, sending his side to the change-room with a 23-6 advantage.
The break gave little relief to the visitors as the Bulls scored their third try six minutes after the restart.
Captain Pierre Spies got the rub of the green playing in his 100th Super Rugby match for the Bulls.
The hosts set up a driving maul from a lineout and were stopped shortly before the line.
Hougaard sent the ball wide from the ruck to Spies, who got over the line for the try, with Steyn converting.
The Highlanders' problems were compounded when wing Maritino Nemani was yellow-carded for a high tackle on Bjorn Basson.
Shortly after Nemani's departure, the Bulls almost turned their numbers advantage into points when centre Jan Serfontein thought he had scored.
Serfontein was stopped short of the line and stretched to place the ball, however, the television match official disallowed the try.
As Nemani was about to make his return onto the field, teammate Chris King received his marching orders for collapsing a maul, with 20 minutes left in the match.
The Bulls though struggled to take full advantage of his absence and it seemed they would miss out on a four-try bonus point.
With eight minutes left in the clash, the Highlanders scored their first try when Fumiaki Tanaka broke from a ruck for the five-pointer, with Hayden Parker converting.
The Bulls found the breakthrough with Jano Vermaak breaking on the blindside from a maul to score with three minutes on the clock.
The Highlanders scored a consolation try at the death when Tamati Ellison also went over the whitewash.
Final Score Bulls 35 (23) Highlanders 18 (6)
Tries - JJ Engelbrecht, A.Ndungane, P.Spies , J.Vermaak
Pen - M.Steyn 3
Con - M.Steyn 3
Tries - F.Tanaka, T.Ellison
Pen - C.Slade 2
Con - H.Parker
Cards - T.Nemani (47th min yellow) C.King (56th min yellow)
Referee: Jaco Peyper
Assistant Ref 1: Stuart Berry
Assistant Ref 2: Attie Buitendag
TMO : Johan Greeff
Jurgen Visser , Akona Ndungane , JJ Engelbrecht, Serfontein, Lionel Mapoe, Morne Steyn, Francois Hougaard, Pierre Spies (c), Dewald Potgieter , Deon Stegmann, Juandre Kruger, Flip van der Merwe, Frik Kirsten, Chiliboy Ralepelle, Morne Mellet.
Replacements: Callie Visagie, Werner Kruger, Grant Hattingh, Arno Botha , Jano Vermaak, Louis Fouche, Bjorn Basson.
1. Jamie Mackintosh ,2. Andrew Hore (captain),3. Chris King,4. Brad Thorn ,5. Jarrad Hoeata ,6. Joe Wheeler ,7. John Hardie,8. Mose Tuiali’i,9. Aaron Smith ,10. Colin Slade ,11. Hosea Gear (vice-captain),12. Shaun Treeby ,13. Tamati Ellison ,14. Tino Nemani ,15. Ben Smith
Replacements : 16. Liam Coltman ,17. Tony Woodcock ,18. Elliot Dixon ,19. TJ Ioane ,20. Fumiaki Tanaka ,21. Hayden Parker ,22. Jason Emery