Donald Trump got hit from all sides on Thursday night. Ted Cruz painted the architect of the Great Wall of Trump as the financier of the Gang of Eight immigration bill conservatives loathe. Marco Rubio portrayed the real estate tycoon as a huckster who would be selling knockoff Rolexes on the street if not for his family’s money. And CNN’s Wolf Blitzer and his fellow moderators questioned the winner of the past three nominating contests over everything from his unreleased tax returns to his horrendous polling numbers among Hispanics.

Trump, though, remained largely calm throughout the night, giving nearly as good as he got during two-plus hours on the Houston stage. He didn’t win every individual skirmish, but with more likely victories awaiting him on Super Tuesday, he won enough to leave Texas in the same position that he arrived: as the clear front-runner.

Still, it was obvious early that Rubio and Cruz came ready to fight—a promising development for both senators, given how much time they’ve spent attacking each other instead of the man who’s winning.

Rubio in particular was more aggressive than we’ve seen him in months. He threw the first punch of the night, hitting Trump over a lawsuit that Polish workers filed against him, a topic he’d return to several times throughout the debate. The Florida senator urged viewers at home to “go online and Google it,” telling Trump: “You’re the only person on this stage that’s ever been fined for hiring people to work on your projects illegally.” Rubio also looked to undercut Trump’s image as a businessman. “If he hadn’t inherited $200 million, you know where Donald Trump would be right now?” Rubio said. “Selling watches in Manhattan.” (Burn!)

Later, while Trump was declining to give details of his plan to replace Obamacare, Rubio tried to play the role that Chris Christie did last month. “Now he’s repeating himself,” Rubio said to cheers after the Donald—never a man to speak in full sentences to begin with—stammered repeatedly about how much “competition” his plan will create in the insurance marketplace.

Rubio is desperate to turn the nominating contest into a two-man race, and at times tonight he made it appear as though he had. Cruz, who is expected to win his home state of Texas next week, didn’t have his best night—though, to be fair, he also didn’t have his worst. The Texas senator was involved in fewer high-profile battles than Rubio and Trump, though he did attack the GOP front-runner on topics ranging from Obamacare to “religious liberty.” Cruz also finally found a way to tie Trump to the doomed Gang of Eight immigration bill, pointing out that the magnate had donated thousands of dollars to Sen. Chuck Schumer. “When you’re funding open border politicians, you shouldn’t be surprised when they fight for open borders,” Cruz said.

Neither man landed the type of knockout blow they were looking for, however. Hit Trump, and get hit right back. When Rubio attacked Trump as being the only man on stage who had been fined for hiring undocumented workers, the front-runner shot back: “I’m the only one at this stage that’s hired people,” he said. “You haven’t hired anybody.” At another point, Rubio tried to zing Trump by suggesting the developer would use undocumented labor to build his much beloved wall. Trump only seemed to shrug it off, saying, “Such a cute sound bite.” Meanwhile, he found time to sneak in mentions of Rubio’s credit card debt, and the million-dollar loan Cruz received from Goldman Sachs that he forgot to mention to the FEC.

All in all, it was a messy debate. While it started with relative decorum, by the end of the second hour, the brawling big three spent long stretches interrupting and talking over each other. At some points, Rubio and Cruz were pleading for more time, while Trump (perhaps disingenuously) appeared eager for less. In a normal race, I’d believe that Trump was wounded by his rivals on Thursday. But the past eight-plus months have proven this is not a normal race.

Read more Slate coverage of the GOP primary.