James Anderson completed a five-wicket haul as England dismissed South Africa for 223 on the third morning of the Cape Town Test, banking a lead of 46.
The Proteas resumed on 215 for eight and Anderson wasted little time wrapping things up.
Having dismissed Keshav Maharaj with the final ball of the previous evening, the 37-year-old seamer picked up where he left off as Kagiso Rabada nicked behind.
Anrich Nortje watched the hat-trick delivery sail past with no shot offered before a booming thick edge was brilliantly held by Ben Stokes.
Both men were celebrating a landmark success – Anderson completing his 28th five-for in Test cricket and Stokes becoming the first English fielder, excluding wicketkeepers, to take five catches in an innings.