Mainz pulled further away from the Bundesliga relegation zone, but Augsburg and Hertha Berlin remained in trouble.
Elsewhere, Werder Bremen and Borussia Monchengladbach drew as they both continued to chase places in Europe.
Nicolai Muller and Adam Szalai both scored a goal and set up another as Mainz beat Cologne 4-0 at home to pull further away from the Bundesliga relegation zone and keep the visitors in the bottom three.
Eugen Polanski made it 1-0 in the 19th minute from the spot for Mainz and Mohamed Zidan doubled the lead after 32 minutes. Muller pushed the margin to 3-0 in the 37th minute and Szalai scored goal number four in the 55th minute.
Stuttgart extended their unbeaten Bundesliga run to eight games by coming from behind to win 3-1 at relegation-threatened Augsburg.
Nando Rafael put the hosts ahead with a fifth-minute penalty but Serdar Tasci equalised in the 24th minute and Martin Harnik gave the visitors the lead in the 34th minute before in-form Vedad Ibisevic sealed matters six minutes from time.
The result marked fifth-placed Stuttgart's sixth win in their eight-match undefeated streak, while for Augsburg it was a second straight loss and left them on 30 points - just one point clear of the drop zone.
Roman Hubnik scored at both ends as Freiburg created more space between themselves and the relegation zone with a victory at Hertha Berlin who desperately needed the points in their fight against the drop.
Freiburg went ahead after seven minutes on an own goal by Hertha defender Hubnik and made it 2-0 with Sebastian Freis' goal in the 67th minute.
Hubnik scored again - this time for Berlin - in the 81st minute but it was too little, too late.
Freiburg have won five of their last seven games to take their points total to 35, six points above the relegation places.
But Hertha have won just once in their last six games and remain on 27 points after this latest defeat.
Werder Bremen overcame playing a man down for 63 minutes to come back and grab a draw at home to Borussia Monchengladbach.
Markus Rosenberg gave Bremen the lead after 18 minutes and the hosts saw defender Sebastian Boenisch red-carded nine minutes later.
Mike Hanke equalised for Gladbach in the 52nd minute and then fired his side ahead on 66 minutes. But Naldo equalised in the 74th minute for Bremen.
Bremen have not won in five games and just once in the past eight but picked up a point to move into the Europa League places.
Gladbach also have just one victory in their past eight matches to remain in the Champions League play-off place.