91³Ô¹ÏÍø

Watch CBS News

Corey O'Connor defeats Tony Moreno in race for Pittsburgh mayor, AP projects

Democrat Corey O'Connor defeated Republican Tony Moreno in the race for mayor of Pittsburgh on Tuesday, the Associated Press projects. 

O'Connor, the Allegheny County controller, will succeed Ed Gainey, a one-term mayor whom he beat in May's hotly contested Democratic primary. Gainey made history during the 2021 election when he became the city's first Black mayor. 

O'Connor said he is ready to move the city forward as mayor, a position once held by his late father, Bob O'Connor. The AP projected O'Connor the winner at 8:26 p.m. on Tuesday.

"I want to thank you, the people of Pittsburgh," O'Connor said in a victory speech Tuesday night. "This victory belongs to you. No matter who you supported tonight, we are united in the fight for a safer, more transparent and more robust city."  

O'Connor, a former Pittsburgh city councilmember, campaigned on a promise to move the city forward. In O'Connor's view, Pittsburgh has been stuck in neutral and suffering from a lack of self-confidence, not generating new jobs and opportunities and having never regained its momentum after the COVID-19 pandemic. He believes the city needs to be seeking out those wanting to build and do business here. 

"The road that we will travel is long and steeply uphill, but I promise you this: I will be honest and transparent about the challenges that we face," O'Connor said. "I will listen to each and every one of you. I will work tirelessly to commit to the promises that we made throughout this campaign. This victory is just the beginning, but I cannot do this alone. I'm asking you to join me in remaking this great city."

Early Monday morning, a they would like O'Connor to prioritize as mayor of the city. 

With his election victory over Moreno, a retired Pittsburgh police officer, Pittsburgh hasn't had a Republican mayor since 1933. Moreno ran against Gainey in the 2021 primary election as a Democrat and in the 2021 general election as a Republican

Moreno told KDKA on Tuesday that he for mayor. During his victory speech, O'Connor highlighted Moreno's eagerness to run in this election.

Pittsburgh mayoral race results

What's next for Corey O'Connor?

O'Connor is set to inherit a city with multiple budget challenges.

The city faces the end of federal COVID-19 relief funding and a drop in tax assessments on Downtown buildings, plus concerns over an aging fleet of vehicles and drastic understaffing, resulting in burnout and increased overtime

In July, Pittsburgh City Controller Rachael Heisler's annual fiscal report found the city is spending more money than it's taking in. She described the city's financial situation as "precarious." However, Heisler said the city is not yet in a crisis, but will be unless steps are taken to rein in non-essential spending and raise new revenue. 

The demands are continuing to grow as Pittsburgh struggles to financially meet them.   

Gainey congratulates O'Connor

 to social media Tuesday night, Gainey said he congratulated O'Connor and extended an invitation to begin the formal transition process.  

"It has been my greatest joy to serve as the 61st Mayor of Pittsburgh," Gainey said in the statement. "I wish Mayor-elect O'Connor all the best as he assumes the responsibility of leading our city next year." 

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=fd53910ecf4604072044ab7c46d9b028'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });