The Stormers kept their second clean sheet in as many weeks with a 13-0 victory over the Bulls at Newlands on Saturday.
After beating the Hurricanes 27-0 last week, the Stormers have now followed that up with another blanking, this time of the Bulls.
The victory was built on rock-solid defence and a solid set-piece.
Willemse gave the home side an early lead with a third-minute penalty from 40 metres out after his opposite number Morne Steyn was penalised for a high tackle.
It was a rather uneventful game with stoppages aplenty and the Bulls doing everything they could to slow the game down so as to prevent the Stormers from employing the high tempo ball-in-hand rugby they tend to favour.
Indeed, such was the caginess of the encounter that the next scoring opportunity came only on the hour mark after the Bulls were guilty of throwing the ball skew in to the lineout but Willemse missed his penalty attempt.
The Stormers won a penalty deep inside Bulls' territory after Seabelo Senatla got himself over the ball and forced the turnover as the visitors were penalised for holding on.
After kicking to touch, the Stormers set up the five-metre attacking lineout and hooker Scarra Ntubeni subsequently went over at the back of a well-worked driving maul four minutes from half-time to ensure the home side took a 8-0 lead in to the interval.
Sevens speedster Seabelo Senatla scored the Stormers' second try ten minutes after the break. Number eight Johan du Toit ran at a gap and managed to free his hands, getting the ball away to full-back Dillyn Leyds, who dished the final pass up for Senatla to complete a simple finish in the left-hand corner.
The Bulls failed to ask any real questions of the Stormers' defence with too much lateral running and not enough ingenuity in general on attack as the Stormers kept them scoreless in a low-scoring game.
Stormers - Tries: Ntubeni, Senatla. Pen: Willemse.
Stormers: 15 Dillyn Leyds, 14 Sergeal Petersen, 13 Ruhan Nel, 12 Jamie Roberts, 11 Seabelo Senatla, 10 Damian Willemse, 9 Herschel Jantjies, 8 Johan du Toit, 7 Pieter-Steph du Toit, 6 Jaco Coetzee, 5 Chris van Zyl, 4 Salmaan Moerat, 3 Frans Malherbe, 2 Scarra Ntubeni, 1 Steven Kitshoff (c)
Replacements: 16 Chad Solomon, 17 Ali Vermaak, 18 Wilco Louw, 19 Cobus Wiese, 20 Ernst van Rhyn, 21 Juarno Augustus, 22 Godlen Masimla, 23 Jean-Luc du Plessis
Bulls: 15 Warrick Gelant, 14 Cornal Hendricks, 13 Johnny Kotze, 12 Burger Odendaal (c), 11 Rosko Specman, 10 Morné Steyn, 9 Ivan van Zyl, 8 Josh Strauss, 7 Abongile Nonkontwana, 6 Jeandré Rudolph, 5 Juandré Kruger, 4 Andries Ferreira, 3 Trevor Nyakane, 2 Jaco Visagie, 1 Lizo Gqoboka
Replacements: 16 Johan Grobbelaar, 17 Gerhard Steenekamp, 18 Wiehahn Herbst, 19 Ruan Nortje, 20 Wian Vosloo, 21 Embrose Papier, 22 Manie Libbok, 23 Divan Rossouw
Referee: Marius van der Westhuizen (South Africa)
Assistant referees: Egon Seconds (South Africa), Divan Uys (South Africa)
TMO: Joey Klaaste-Salmans (South Africa)