CHICAGO – Voters chose a progressive former teacher over a tough-on-crime former public schools executive to lead the nation’s third-largest city, capping off a mayoral election season that has centered on public safety, taxes and education.

Brandon Johnson, 47, a union organizer endorsed by the teachers union, beat out Paul Vallas, 69, a former city budget director backed by the city’s police union, in a tight runoff that marked a momentous win for progressive groups.

With about 91% of the vote counted, Johnson had 51.4% to 48.6% for Vallas. More votes will be counted as absentee ballots arrive in the mail.

“You know, they said this would never happen,” Johnson said in a victory speech late Tuesday. “Now they know.”

Johnson and Vallas proceeded to the runoff after none of nine candidates received more than 50% of the vote in an election in late February. Lori Lightfoot, 60, the city’s first Black woman and first openly gay person to serve as mayor, placed third, becoming the city’s first one-term mayor in 40 years.

Though both Johnson and Vallas have deep roots in the Democratic Party, the candidates presented opposing views on issues such as crime, taxes, schools and investment in policing.

Johnson has called for new taxes and expanding social programs. He says the city should focus on mental health treatment, affordable housing for all and jobs for young people instead of further investing in policing and incarceration.

He has also proposed a plan he says will raise $800 million by taxing “ultrarich” people and businesses. Johnson’s plan includes a per-employee “head tax” on employers and an additional tax on hotel room stays.

“To the Chicagoans who did not vote for me … I’ll be the mayor for you, too,” he said.