The Highlanders ended the Bulls five match winning streak in Super Rugby with a 16-11 victory at the Forsyth Barr Stadium in Dunedin.
The result is the second in a row for the Highlanders against the Bulls after they ended the Bulls 19 match unbeaten record in Pretoria last year.
The match was a physical armwrestle with neither side being able to pull away from the other until the final quarter.
The Highlanders went 10 points ahead of the Bulls through a converted Jarrad Hoeata try and a penalty from Mike Delany.
The Bulls mounted a late charge which produced a try from Willie Wepener but Morne Steyn was unable to convert the try and the Bulls trailed by five points.
The visiting Bulls continued flirt with the Highlanders tryline but the home side managed to hold on for victory.
The result put a dampener on Morne Steyn's celebrations in his 100th Super game for the Bulls as he was uncharacteristically off-target with the boot, missing a conversion and two penalties that could have changed the outcome.
The Bulls, who started the weekend as the championship leaders, took home a bonus point but slipped behind the Chiefs, who picked up four points for having a bye.
In a tough showdown, the Highlanders did not hit the lead until the final quarter when Jarrad Hoeata scored their sole try.
They were then left to stave off a late charge by the Bulls that produced one try and nearly resulted in a second before captain Pierre Spies gave away a penalty on the line.
"It was a physical game and fast," said a relieved Highlanders captain Jamie Mackintosh.
"It was a pretty big game for us. Obviously, we had lost two on the trot and the way the competition is we're still in the hunt and we've got big games coming up."
The Bulls, who pulled off narrow wins in their opening two tour matches against the Melbourne Rebels and Waratahs, took the early initiative.
They caned the Highlanders in the lineouts while being able to regain much of their own ball as they subjected the Highlanders to a relentless aerial bombardment.
They also moved their defensive line-up quickly to unsettle the Highlanders game, but despite their command the Bulls rarely looked like finding the tryline.
Steyn landed two penalties in the first half to one for the Highlanders by Mike Delany to have the Bulls leading 6-3 at the break.
The Highlanders could well have been level at the turn had they not squandered one three-point chance when they took a tap penalty close to the Bulls line and an intercept by Bjorn Basson saw them lose 60 metres.
But Delany made no mistake six minutes into the second half when he landed his second penalty to level the score at 6-6.
As the Highlanders stepped up their running game the first try came when the Bulls were a man down after Dean Greyling was yellow-carded.
Hoeata's first drive at the line was rejected as inconclusive by the television match official but a minute later there was no mistake when the former All Blacks lock scored near the uprights.
Delany added the conversion and another penalty to stretch the Highlanders to a 16-6 lead.
Greyling marked his return to the field by dropping the ball as he dived for a try, but the Bulls picked up a five-pointer soon after when replacement hooker Willie Wepener touched down.
With time nearly up, the Bulls pack made another charge at the Highlanders line but Spies found himself isolated and was penalised for holding on.
Final Score Highlanders 16 (3) Bulls 11 (6).
Tries - J. Hoeata
Pen - M. Delany 3
Con - M . Delany
Tries - W. Wepener
Pen - M. Steyn 2
Referee: Ian Smith
Assistant Ref 1: Garratt Williamson
Assistant Ref 2: Kane McBride
TMO: Matthew Muir
Replacements: 16. Andrew Hore, 17. Bronson Murray, 18. Hoani MacDonald/Josh Bekhuis, 19. Scott Fuglistaller, 20. Jimmy Cowan, 21. Chris Noakes, 22. Kenny Lynn.
15. Zane Kirchner, 14. Akona Ndungane, 13. Johann Sadie, 12. Wynand Olivier, 11. Bjorn Basson, 10. Morne Steyn, 9. Francois Hougaard, 8. Pierre Spies (c), 7. CJ Stander, 6. Dewald Potgieter, 5. Juandre Kruger, 4. Flip van der Merwe, 3. Werner Kruger, 2. Chiliboy Ralepelle, 1. Dean Greyling.
Replacements: 16. Willie Wepener, 17. Rayno Gerber, 18. Wilhelm Steenkamp, 19. Arno Botha, 20. Jano Vermaak, 21. Louis Fouche, 22. JJ Engelbrecht.