Investec Champions Cup
Bulls (7) 21
Tries: Coetzee, Hanekom 2 Cons: Goosen 3
Northampton (12) 30
Tries: Hendy, Augustus, Freeman 2 Cons: Smith 2 Pens: Smith 2
Tommy Freeman scored two tries as Northampton produced a display of outstanding spirit in the altitude and heat to earn a Champions Cup bonus-point win over Bulls in South Africa.
The victory keeps up Northampton's perfect start in Pool Three, with two wins from two and a maximum 10 points.
In physically demanding conditions in Pretoria, the Saints held out in the face of the Bulls' power, and rode the loss of captain George Furbank with an arm injury, to lead just after the half-hour mark through George Hendy.
The full-back, barely on for two minutes as Furbank's replacement, took on Fin Smith's offload after Fraser Dingwall had charged at the Bulls defence.
Bulls were quickly in front as Marcell Coetzee evaded Dingwall's tackle and pumped through to score a try converted by Johan Goosen.
Northampton faced a further setback right at the end of the first half when prop Emmanuel Iyogun was sent to the sin-bin.
But with the first-half clock in the red, and barely a minute after being reduced to 14 players, the visitors restored their lead as Alex Mitchell took a quick tap penalty and opened up the Bulls defence for Juarno Augustus to go over in the corner.
The Bulls had seen two tries ruled out in an opening half hour where they somehow failed to turn their physical dominance into points - and then another disallowed early in the second half as Canan Moodie failed to ground the ball as he chased a kick through.
Smith extended the lead with a penalty, before Freeman capitalised on a line-out to burst through David Kriel's tackle - with the television match official ruling that he had managed to get the ball down.
But Cameron Hanekom surged out of a scrum and bounced off the referee to evade Mitchell and score to give the hosts hope.
Then the number eight repeated the trick to bring the hosts back to within a point with 10 minutes left.
Smith took advantage of the altitude to land a penalty almost from halfway, and was narrowly off target with a drop-goal attempt from nearly as far out - before Freeman dived over again in the final four minutes to seal a bonus point and a memorable victory.
The Premiership champions, who have struggled for form domestically so far this season, began their European campaign with a 38-8 victory over an under-strength Castres last weekend, but this was a very different test.
In temperatures topping 30C in Pretoria, they had to work hard just to hang on for the opening half hour, suffering a setback when Furbank was forced off, using his shirt as a makeshift sling to cradle his right arm after being clattered by Bulls captain Elrigh Louw.
Northampton were undoubtedly helped in the early stages by Bulls' lack of ruthlessness. The hosts may have dominated physically, causing the visitors all sorts of trouble in the scrum, but failed to convert that into points when the door appeared to be wide open.
The Saints conceded four penalties in the opening 15 minutes - with Iyogun twice penalised for collapsing the scrum - and twice escaped as their hosts had tries ruled out, while Goosen also dropped the ball barely a couple of metres from the line.
That came after Devon Williams had gone clear from an Embrose Papier pass over the top to dive in at the corner - with Goosen actually adding the conversion before the try was pulled back for review and ruled out because of an obstruction by Willie le Roux.
Then former Sale hooker Akker van der Merwe darted over to dot down, but referee Luc Ramos had already blown his whistle for an obstruction by JF van Heerden.
Northampton lost Iyogun, yet not only negotiated his 10-minute absence without conceding any points, but also turned a deficit into a lead through Augustus' score.
The Bulls' attacking profligacy haunted them again as Moodie and Le Roux chased a kick over the top, with the centre just winning the race - but as Goosen was lining up the kick, the television match official was called in once more, and ruled that the ball had not been grounded.
When Freeman extended the Northampton lead to 22-7, the win looked there for the taking - but there was always the danger they would tire in the heat, and the impressive Hanekom's double score increased their anxiety.
It was to Northampton's credit that they did not wilt, and Smith and Freeman took the match out of the hosts' reach.
Bulls: Le Roux, De Klerk, Moodie, Kriel, Williams; Goosen, Papier; Steenekamp, Van der Merwe, Louw, Vermaak, Van Heerden, Coetzee, Louw (capt), Hanekom.
Replacements: Wessels, Tshakweni, Klopper, Slabbert, Nama Xaba, Burger, Chamberlain, Gans.
Northampton: Furbank (capt); Freeman, Dingwall, Hutchinson, Sleightholme; Smith, Mitchell; Iyogun, Langdon, Millar-Mills, Mayanavanua, Lockett, Coles, Pollock, Augustus.
Replacements: Wright, Haffar, Davison, Munga, Scott-Young, Pearson, McParland, Hendy.
Referee: Luc Ramos (France)